Event Handler 是SharePoint中与网站(web),列表/文档库(list),列表项(list item),邮件(Email)相关联的事件处理程序,当我们对站点内容进行某些操作是,Event Handler就会截获相应的事件,然后对其进行相应的操作。
所以,SharePoint中的EventHandler有Web Level,List Level,List Item Level和Email这几种。SharePoint在开发EventHandler的时候,需要继承SPWebEventReceiver,SPListEventReceiver,SpListItemEventReceiver或SPEmailEventReceiver类,然后实现里面的方法来完成我们的功能。
其实,SharePoint开发EventHandler是很简单的,如果说难的话,可能就难在了业务上面。下面,就以一个Demo来实现两个功能,记录一下EventHandler的开发过程,我这里创建的SharePoint2007项目,都是使用的WSPBuilder来完成的,它的确是个不错的工具。
1.首先,需要到CA中开启站点的EventHandler支持。
2.打开VS2005,创建WSPBuilder项目。
3.项目创建完成后,需要注意一下两个xml文件,分别是:feature.xml和elements.xml
feature.xml<?xml version="1.0" encoding="utf-8"?> <!-- Feature中属性的说明 ID:该EventHandler的ID,这个ID是唯一标示该EventHandler的,是一个GUID类型的值 Title:部署EventHandler后,在Site features(当然这取决于Scope所指定的值)中查看或激活该EventHander时候,看到的Title Description:部署EventHandler后,在Site features(当然这取决于Scope所指定的值)中查看或激活该EventHander时候,看到的Description Version:当前的版本 Hidden:默认是否激活,ture-表示在部署的时候就激活该EventHandler,False-表示在部署后,到站点的features中去手动激活。 Scope:指定当前EventHandler的作用域,分别有“Web”,“Site”,“WebApplication”和“Farm”四种 DefaultResourceFile:为EventHandler中的xml指定一个公共的资源文件 --> <Feature Id="b845f8be-298d-4197-92be-bc06919f636e" Title="EventHandler_Demo_1" Description="Description for EventHandler_Demo_1" Version="12.0.0.0" Hidden="FALSE" Scope="Web" DefaultResourceFile="core" xmlns="http://schemas.microsoft.com/sharepoint/"> <ElementManifests> <ElementManifest Location="elements.xml"/> </ElementManifests> </Feature>
elements.xml<?xml version="1.0" encoding="utf-8" ?> <Elements xmlns="http://schemas.microsoft.com/sharepoint/"> <!-- 这里的ListTemplateId指的是将此EventHeadler绑定到的List的TemplateId, 因为我们在创建List的时候(创建web site,document library的时候也是一样),首先是选择一个模板,然后依照此模板来创建List, 所以,这样一来,当我们在EventHandler中指定了ListTemplateId的时候,也就意味着:所有以此模板创建的List都会执行此EventHandler。 为了能让这种特定的EventHandler在我们指定的List中起作用,我们需要在程序中进行处理。当然,这里的ListTemplate还是要指定的。 有关SharePoint ListTemplateId 信息,参见:http://www.cnblogs.com/qixing_gan/archive/2012/11/26/2789292.html --> <Receivers ListTemplateId="101"> <Receiver> <Name>AddedEventHandler</Name> <Type>ItemAdded</Type> <SequenceNumber>10000</SequenceNumber> <Assembly>SharePoint_Demo_130410, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0e0d670542fb075a</Assembly> <Class>SharePoint_Demo_130410.EventHandler_Demo_1</Class> <Data></Data> <Filter></Filter> </Receiver> <Receiver> <Name>ItemDeletingEventHandler</Name> <Type>ItemDeleting</Type> <SequenceNumber>10000</SequenceNumber> <Assembly>SharePoint_Demo_130410, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0e0d670542fb075a</Assembly> <Class>SharePoint_Demo_130410.EventHandler_Demo_1</Class> <Data></Data> <Filter></Filter> </Receiver> </Receivers> </Elements>
4.好了,feature.xml和elements.xml文件该处理的地方以处理好了,这里,我需要添加两个事件,分别是ItemAdded和ItemDeleting,开始编写代码了。
ItemAdded & ItemDeleting /// <summary> /// 当用户向名为“Ebooks”的文档库中添加一个文档的时候, /// 程序自动向一个记录操作的List(List的名字为"EBooksLogs")中添加一笔记录。 /// </summary> /// <param name="properties"></param> public override void ItemAdded(SPItemEventProperties properties) { DisableEventFiring(); //这里需要注意:因为在elements.xml中指定的ListTemplateID是101(文档库的TemplateId是101), //这就意味着,当所有TemplateId为101的文档库,在添加文档时都会执行此事件,所以,为了让此事件 //只是用与我们特定的文档库,我们可以在此判断当前文档库的名字是否是我们希望的文档库。 //这样以来,其他文档库就不会执行里面的代码了。 if (properties.ListItem != null && properties.ListTitle == "Ebooks") { SPListItem spEBooksItem = null; SPList spListEbooksLogs = null; spEBooksItem = properties.ListItem; string strBookNmae = spEBooksItem["Name"].ToString(); string strAction = "Add"; DateTime modified = Convert.ToDateTime(spEBooksItem[spEBooksItem.Fields["Modified"].InternalName]); string modifiedBy = properties.UserLoginName; spListEbooksLogs = (new SPSite(properties.SiteId)).RootWeb.Lists["EBooksLogs"]; if (spListEbooksLogs != null) { SPListItem item = spListEbooksLogs.Items.Add(); item["Title"] = strBookNmae; item["Action"] = strAction; item[item.Fields["Modified"].InternalName] = modified; item["Editor"] = (new SPSite(properties.SiteId)).RootWeb.EnsureUser(modifiedBy); item.Update(); } } EnableEventFiring(); } public override void ItemDeleting(SPItemEventProperties properties) { //base.ItemDeleted(properties); DisableEventFiring(); if (properties.ListItem != null && properties.ListTitle == "Ebooks") { SPListItem spEBooksItem = null; SPList spListEbooksLogs = null; spEBooksItem = properties.ListItem; string strBookNmae = spEBooksItem["Name"].ToString(); string strAction = "Deleted"; DateTime modified = Convert.ToDateTime(spEBooksItem[spEBooksItem.Fields["Modified"].InternalName]); string modifiedBy = properties.UserLoginName; spListEbooksLogs = (new SPSite(properties.SiteId)).RootWeb.Lists["EBooksLogs"]; if (spListEbooksLogs != null) { SPListItem item = spListEbooksLogs.Items.Add(); item["Title"] = strBookNmae; item["Action"] = strAction; item[item.Fields["Modified"].InternalName] = modified; item["Editor"] = (new SPSite(properties.SiteId)).RootWeb.EnsureUser(modifiedBy); item.Update(); } } EnableEventFiring();
5.代码也编写完成了,接下来的工作就是部署咯。
部署方式很简单的,WSPBuilder就是这么的给力,我们只需要做一下工作就可完成部署。
(鼠标右键项目,Build项目)
(Build WSP当前的项目,这一步是打包的过程,会将需要发布的文件生成一个WSP文件包)
(Deploy,这一步就是将刚才打包成WSP的文件分别部署到指定的发布位置,完成部署工作)
6.部署完毕后,需要到站点中去激活EventHandler,注意,我在创建EventHandler的时候,Scope指定的是“Web”,所以,我需要到“Site features”中去激活该EventHandler。
7.OK,一切就绪,测试下吧。
以上是在SharePoint2007中使用WSPBuilder开发的EventHandler,相比之下,SharePoint2010开发EventHandler就方便多了,下面记录下SharePoint2010开发EventHandler与2007的不同以及注意事项。
1.SharePoint2010开发EventHandler时,不需要到CA中开启EventHandler支持;
2.SharePoint2010开发EventHandler时,在创建的项目中添加Event Receiver项,然后一步步选择事件接收器类型、事件源、处理什么样的事件。很方便就完成了项目的创建。
如下图所示:
3.SharePoint2010开发EventHandler时,可以将事件源指定到具体的位置(即具体到那一个Web或List上面去),如下所示:
Elements.xml<?xml version="1.0" encoding="utf-8"?> <Elements xmlns="http://schemas.microsoft.com/sharepoint/"> <!-- 以下各节点中属性和SharePoint2007中是一样的,唯一不同的是在Receivers这一级节点上面, 我们可以指定ListUrl,标识该EventReceiver具体作用于哪一个List上面, 同时,区别于SharePoint2007中的是,在Receivers节点指定Scope的值, 而在SharePoint2007中,我们是在Feature.xml中指定Scope的值的。 --> <Receivers ListTemplateId="" ListUrl="/Ebooks" ListTemplateOwner="" RootWebOnly="" Scope=""> <Receiver> <Name>EventHandler_Demo_1ItemAdding</Name> <Type>ItemAdding</Type> <Assembly>$SharePoint.Project.AssemblyFullName$</Assembly> <Class>EventHandler_2010_Demo.EventHandler_Demo_1.EventHandler_Demo_1</Class> <SequenceNumber>10000</SequenceNumber> </Receiver> <Receiver> <Name>EventHandler_Demo_1ItemDeleting</Name> <Type>ItemDeleting</Type> <Assembly>$SharePoint.Project.AssemblyFullName$</Assembly> <Class>EventHandler_2010_Demo.EventHandler_Demo_1.EventHandler_Demo_1</Class> <SequenceNumber>10000</SequenceNumber> </Receiver> </Receivers> </Elements>
4.SharePoint2010部署方便,当我们在开发中选择部署类型为“沙盒解决方案”时,也就意味着,我们可以将开发好的WSP文件,经过站点管理员上传到SharePoint站点,并激活就可以让其工作了。
好了,就记录这么些吧,以后在慢慢补充。
有关SharePoint2010开发EventHandler(2010中jiaoEvent Receiver)可参考:http://www.cnblogs.com/chenxizhang/archive/2010/04/25/1719841.html