While working with Remote Event Receivers I came across a scenario where we need to hook up the Event Handlers to any of the existing lists in a site.
For example we got a list called “Products” in which we need to stop the users to delete any list item.
This requirement can be achieved simply by deploying a Farm Solution containing the Event Receiver SPI hooked up with the Products List Item Deleting Event.
But what if we are not allowed to deploy any code solution in SharePoint Environment?
The simple answer to this complex question is involve Remote Event Receivers and hooked them up to the existing list which is a bit of tricky task.
In this article we will see to the steps to register Remote Event Receivers with the existing Lists & Libraries while utilizing our knowledge based on earlier articles in this series which can be reached at:
- SharePoint 2013: Remote Event Receivers
- SharePoint 2013: How to develop Remote Event Receivers for App Events
- SharePoint 2013: How to develop Remote Event Receivers for List And List Item Events
- SharePoint 2013 : Remote Event Receivers on List Item Event – Real Business Scenarios
Let start with a Provider Hosted App that will register the Remote Event Receivers with the existing SharePoint Lists
Create “New Project”
Select “App for SharePoint” as SharePoint Project Template
Specify the URL of the Debugging Site, which is called as Host Web in case of an App
Select “Provider-Hosted” as App Hosting Model
Select “ASP.Net Web Forms Application” as Project Template for the Remote Web
Enter Certificate Details as we did in earlier demos
On successful creation of the Solution two projects should be added as shown below.
“PH-Bind-Event-Receivers-With-Existing-List” – Represents the Code Base for the Provider Hosted App
“PH-Bind-Event-Receivers-With-Existing-ListWeb” – Represents the Code Base for the Remote Web
Select App Project and Press F4 to see the properties
Under “App for SharePoint Events” Set the Events that the App is required to respond to.
Here we would need only “App Installed” and “App Uninstalling” Event to work on so we would enable only these two events by changing the value to “True”
As soon as we enable the App Events a new service class gets added to the Solution by the name “AppEventReceiver.svc” under the Services Folder
Detailed walkthrough of the highlighted steps is as follows-
Step 1- Check for the Event Raised and make sure that we are handling only “AppInstalled” Event
Step 2- This step is tricky of all. It is important to notice how we are getting the full path of the Service Class that will be listening to the lists events.
Since this is the Service that will be hosted somewhere outside SharePoint due to this usual SharePoint Tokens will not work here which means “~remoteAppUrl” Url Token will not work in this case.
So in order to get the complete path to the Service Class we need to make use of “OperationContext” class.
The “OperationContext” class provides you methods (as highlighted below) to extract Absolute Uri to the Service Class irrespective of where it is hosted.
Step 3- Retrieve the Remote Web URL to get the fully qualified path of Service Class
Step 4- Instantiate the App Context by calling “CreateAppEventClientContext” method shipped with TokenHelper.cs Class to facilitates App Authentication Tokens
Step 5- Load the Products List using traditional CSOM way
Step 6- Instantiate new Event Receiver Object using “EventReceiverDefinitionCreationInformation” class. It is important to set following properties to get this Event Receiver added to the collection of Event Receivers of Product List.
Important Properties to set are-
EventType – Specifies the type of Event that can trigger receiver like here we are assigning it to “Item Deleting” Even
ReceiverName – Specifies the unique name of this Event Receiver that can be used to identify it in Event Receivers Collection of Products List
ReceiverUrl – Specifies the full path to Receiver. Assign the value of the Full Path that we have retrieved in Step 2
SequenceNumber – Specifies the Sequence Number for the Event Receiver to add to the Event Receivers Collection of the Product List
Step 7 – Add the Event Receiver Object to Products List Event Receivers Collection
Step 8 – The other Event that we consider is “AppUninstalling”. Since this Event is quite useful to perform cleanup activities like removing the Event Receiver registration with the respective as soon as the App gets uninstalled.
Step 9 – Same as Step 4 above
Step 10 – Same as Step 5 above
Step 11- Loop through all the Event Receivers registered with Products List and find a specific Event Receiver by Name value (recall Step – 6 where we have specified value to “ReceiverName” Property of Event Receiver)
Step 12- Once we identified the specific Event Receiver we can remove it from Event Receivers Collection of Products List
Step 13- This involves Handling of ItemDeleting Event of Products List. We can check the incoming Event Type by using “EventType” property of Event Object (properties)
Step 14- Validates the name of the list that generates the Event, this step is necessary to ensure that we are responding to right Event generated from an intended list
Step 15- Set “ErrorMessage” that needs to be displayed to the User in case User actions try to delete List Items
Step 16- Set “Status” to “CancelWithError” since we want to cancel the User action along with showing him proper error message
That’s it. We are all set to see the efforts in action.
Build and Deploy Solution to SharePoint
Trust the App when asked to and move on
Once deployed successfully we can test the Remote Event Receiver as follows-
Navigate to the Products List
Try to Delete any Item in the list and see if you are able to see the Error Message you set with in Event Receiver’s Properties
Sure enough you will get the Error Message displayed on to Error Page to which SharePoint Navigates you to.
This implementation is really amazing and I can see lot of potential in terms of handling discrete Business Rule and Validation on the existing SharePoint Lists and Libraries without deploying and Server Code in SharePoint Domain.
Hope you find it helpful.