What is the best practice around adding event receivers across all the lists in a Site Collection?
-
see I have updated my response with the code. – Falak Mahmood Jun 05 '12 at 14:34
-
If I'm not mistaken, creating a list item event receiver and scoping it to 'Site' instead of 'Web' will make the Receiver fire for all lists. – Omar Stewey Sep 21 '14 at 16:59
4 Answers
If you want an event receiver on anything, then it's best to attach it to the content type Item (0x01)
Example: CharlieDigital: Programmatically Adding an Event Receiver to a Content Type
- 17,298
- 2
- 40
- 67
- 32,409
- 1
- 33
- 62
-
1
-
3There is one example at CharlieDigital: Programmatically Adding an Event Receiver to a Content Type – Per Jakobsen Jun 04 '12 at 09:33
As Per said, you can attach the following code to add the Event receivers to all the lists in a Site Collection:
All you need to do it to add this code in a Feature Receiver's class file. Note: I did it only for ItemAdding event but you can add other methods as per your likings.
public class Feature1EventReceiver : SPFeatureReceiver
{
// Uncomment the method below to handle the event raised after a feature has been activated.
private SPContentType fetchContentType(SPContentTypeCollection contentTypeCollection, string ID)
{
SPContentType publContentType = null;
foreach (SPContentType contentType in contentTypeCollection)
{
//if (contentType.Id.Equals(ID))
if (string.Equals(contentType.Id.ToString(), ID, StringComparison.InvariantCultureIgnoreCase))
{
publContentType = contentType;
break;
}
}
return publContentType;
}
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
SPSite siteCollection = properties.Feature.Parent as SPSite;
SPWeb myweb = siteCollection.RootWeb;
try
{
SPContentTypeCollection contentTypeCollection = siteCollection.RootWeb.ContentTypes;
SPContentType publPageContentType = fetchContentType(contentTypeCollection, "0x01");
publPageContentType.EventReceivers.Add(SPEventReceiverType.ItemAdding,
"Test.Test.Com, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ea51e61ab1378806",
"Test.Test.Com.EventReceivers");
publPageContentType.Update(true, false);
myweb.Update();
}
catch
{
return;
}
finally{
}
}
You EventReceivers.cs will look like
class EventReceivers : SPItemEventReceiver
{
public override void ItemAdding(SPItemEventProperties properties)
{
if (properties.Context != null)
{
try
{
//do something here
}
catch { return; }
}
}
}
- 17,298
- 2
- 40
- 67
-
-
1Yes, see the link: http://snahta.blogspot.se/2008/08/deleting-all-registered-event-handlers.html – Falak Mahmood Jun 05 '12 at 15:08
-
1Do not dispose SPFeatureReceiverProperties.Feature.Parent Link: http://docs.spcaf.com/v5/SPC110237_DoNotDisposeSPFeatureReceiverPropertiesFeatureParent.html
Do not dispose SPSite.RootWeb Link: http://docs.spcaf.com/v5/SPC110241_DoNotDisposeSPSiteRootWeb.html
– Sergey Sep 21 '14 at 12:03
In my opinion i cannot recommend to add the event receiver to the system content type because it will effect all content types below the system content type. This might lead to unwanted problems an conflicts when the event receiver is fired. What is the reason for adding a event receiver to every list in?
- 2,734
- 16
- 19
-
-
One alternative is to create a feature event receiver that adds the event receiver to the required lists. I'm not quite sure why you want to add a event receiver to all lists. – Stefan Bauer Jun 04 '12 at 11:49