在MOSS中,文档库、列表都支持Event Handler .
过多的介绍我也不会说。 所以看一段代码 介绍一下。新建一个类库项目
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using Microsoft.SharePoint;
- namespace EventHandler
- {
- public class EventHandlerTest:SPItemEventReceiver
- {
- public override void ItemAdded(SPItemEventProperties properties)
- {
- DisableEventFiring();
- SPListItem item = properties.ListItem;
- string name = item["Title"].ToString();
- item["MyTest"] = name + "(" + "Add" + ")";
- item.Update();
- }
- public override void ItemUpdated(SPItemEventProperties properties)
- {
- SPListItem item = properties.ListItem;
- string name = item["Title"].ToString();
- item["MyTest"] = name + "(" + "Update" + ")";
- this.DisableEventFiring();
- item.Update();
- this.EnableEventFiring();
- }
- public override void ItemDeleting(SPItemEventProperties properties)
- {
- properties.ErrorMessage = "该文档不能被删除";
- properties.Cancel = true;
- }
- }
- }
这里边继承了SPItemEventReceiver类。 重写了3个事件,分别实现的功能是,当添加后、修改后触发的事件 当删除前触发的事件
MOSS2007 支持 同步和异步事件 也就是 ItemDeleted(删除后)、ItemDeleting(删除前)
DisableEventFiring(); 这句话的意思是 ,禁止触发其他事件 这个地方让我搞了好长时间,因为每次增加都会去触发UPDATE事件,所以就会更新两次,看一段网上的原话。
/*
引用:http://www.cnblogs.com/linken/archive/2008/07/23/1249402.html
- 问题:
- 最近在开发Eventhandler的时候发现ItemAdded这个方法中如果有对列表项进行更新操作,即执行了item.Update() ,那么就会触发ItemUpdated这个eventhandler事件,我们的本意是编辑,修改的时候
- 去触发ItemUpdated这个eventhandler
- public override void ItemAdded(SPItemEventProperties properties)
- { …
- properties.ListItem.Update();
- }
- public override void ItemUpdated(SPItemEventProperties properties)
- {
- //update code here
- }
- 解决办法:
- 添加DisableEventFiring() 这个方法,阻止其他事件被调用
- public override void ItemAdded(SPItemEventProperties properties)
- {
- DisableEventFiring(); //Prevents events from being raised.
- …
- properties.ListItem.Update();
- }
- 或者不使用properties.ListItem.Update();
- 改为properties.ListItem.SystemUpdate();
*/
例子比较简单,大概就这么多 。 记的添加这个DisableEventFiring(); 就行。
还有就是 记得重启IIS , 因为我搞的时候一直没有重启IIS。所以无论怎样修改,都是错的,所以浪费了很长时间 。
下面说下 部署EventHandler吧。
一种是用FEATURE ,这个网上很多。
还有就是用代码
我们新建个控制台程序
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using Microsoft.SharePoint;
- namespace EventHandlerConsole
- {
- class Program
- {
- static void Main(string[] args)
- {
- SPSite collection = new SPSite("http://ky:8080/sites/site/"); //站点
- SPWeb site = collection.OpenWeb("Docs"); //子站点
- site.AllowUnsafeUpdates = true;
- collection.AllowUnsafeUpdates = true;
- SPList mylist = site.Lists["MyDocument"];//列表
- string assName = "EventHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b2e900cf42986322";
- string className = "EventHandler.EventHandlerTest";
- mylist.EventReceivers.Add(SPEventReceiverType.ItemAdded, assName, className);
- mylist.EventReceivers.Add(SPEventReceiverType.ItemUpdated, assName, className);
- mylist.EventReceivers.Add(SPEventReceiverType.ItemDeleting, assName, className);
- //for (int i = mylist.EventReceivers.Count - 1; i >= 0; i--)
- //{
- // mylist.EventReceivers[i].Delete();
- //} //这段是执行删除那些事件
- Console.WriteLine("It's OK");
- Console.ReadLine();
- }
- }
- }
对于上边 SPSite collection = new SPSite("http://ky:8080/sites/site/");
SPWeb site = collection.OpenWeb("Docs");
SPList mylist = site.Lists["MyDocument"]; 这些 ,大家可以看一下对象模型。
大家看一下我站点的地址 http://ky:8080/SITES/SITE/Pages/Default.aspx
首先我要打开 http://ky:8080/SITES/SITE 用这个地址就可以访问到我的站点
然后打开一个子站点 Docs ,也就是我的 文档中心 , 用http://ky:8080/SITES/SITE/Docs ,可以访问到 站点的 文档中心
然后,获取文档中心的列表 。 我站点中叫MyDocument.
程序大概就这么多。
我们将上边的类库项目编译成DLL文件,放到GAC目录中(C:/WINDOWS/assembly), 然后运行我们的控制台就OK了。
记得 iisreset