EventHandler开发一

    在MOSS中,文档库、列表都支持Event Handler . 

    过多的介绍我也不会说。 所以看一段代码 介绍一下。新建一个类库项目

 

 

   

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Microsoft.SharePoint;
  6. namespace EventHandler
  7. {
  8.     public class EventHandlerTest:SPItemEventReceiver
  9.     {
  10.         public override void ItemAdded(SPItemEventProperties properties)
  11.         {
  12.             DisableEventFiring();
  13.             SPListItem item = properties.ListItem;
  14.             string name = item["Title"].ToString();
  15.             item["MyTest"] = name + "(" + "Add" + ")";
  16.             item.Update();
  17.         }
  18.         public override void ItemUpdated(SPItemEventProperties properties)
  19.         {
  20.             SPListItem item = properties.ListItem;
  21.             string name = item["Title"].ToString();
  22.             item["MyTest"] = name + "(" + "Update" + ")";
  23.             this.DisableEventFiring();
  24.             item.Update();
  25.             this.EnableEventFiring();
  26.         }
  27.         public override void ItemDeleting(SPItemEventProperties properties)
  28.         {
  29.             properties.ErrorMessage = "该文档不能被删除";
  30.             properties.Cancel = true;
  31.         }
  32.     }
  33. }

 

    这里边继承了SPItemEventReceiver类。 重写了3个事件,分别实现的功能是,当添加后、修改后触发的事件   当删除前触发的事件

    MOSS2007 支持 同步和异步事件 也就是  ItemDeleted(删除后)、ItemDeleting(删除前)

 

    DisableEventFiring();  这句话的意思是 ,禁止触发其他事件  这个地方让我搞了好长时间,因为每次增加都会去触发UPDATE事件,所以就会更新两次,看一段网上的原话。

    /*

    引用:http://www.cnblogs.com/linken/archive/2008/07/23/1249402.html

  1. 问题:
  2. 最近在开发Eventhandler的时候发现ItemAdded这个方法中如果有对列表项进行更新操作,即执行了item.Update() ,那么就会触发ItemUpdated这个eventhandler事件,我们的本意是编辑,修改的时候
  3. 去触发ItemUpdated这个eventhandler
  4. public override void ItemAdded(SPItemEventProperties properties)
  5. {     …
  6. properties.ListItem.Update();
  7. }
  8. public override void ItemUpdated(SPItemEventProperties properties)
  9. {
  10.      //update code here
  11. }
  12. 解决办法:
  13. 添加DisableEventFiring() 这个方法,阻止其他事件被调用
  14. public override void ItemAdded(SPItemEventProperties properties)
  15. {
  16.      DisableEventFiring(); //Prevents events from being raised.
  17.      …
  18. properties.ListItem.Update();
  19. }
  20. 或者不使用properties.ListItem.Update();
  21. 改为properties.ListItem.SystemUpdate();

 

*/ 

 

    例子比较简单,大概就这么多 。 记的添加这个DisableEventFiring(); 就行。

    还有就是 记得重启IIS , 因为我搞的时候一直没有重启IIS。所以无论怎样修改,都是错的,所以浪费了很长时间 。

 

 

 

    下面说下 部署EventHandler吧。

    一种是用FEATURE ,这个网上很多。

    还有就是用代码

    我们新建个控制台程序

 

   

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Microsoft.SharePoint;
  6. namespace EventHandlerConsole
  7. {
  8.     class Program
  9.     {
  10.         static void Main(string[] args)
  11.         
  12.         {
  13.             SPSite collection = new SPSite("http://ky:8080/sites/site/");    //站点
  14.             SPWeb site = collection.OpenWeb("Docs");  //子站点 
  15.             site.AllowUnsafeUpdates = true;
  16.             collection.AllowUnsafeUpdates = true
  17.             SPList mylist = site.Lists["MyDocument"];//列表
  18.             string assName = "EventHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b2e900cf42986322";
  19.             string className = "EventHandler.EventHandlerTest";
  20.             mylist.EventReceivers.Add(SPEventReceiverType.ItemAdded, assName, className);
  21.             mylist.EventReceivers.Add(SPEventReceiverType.ItemUpdated, assName, className);
  22.             mylist.EventReceivers.Add(SPEventReceiverType.ItemDeleting, assName, className);
  23.             //for (int i = mylist.EventReceivers.Count - 1; i >= 0; i--)
  24.             //{
  25.             //    mylist.EventReceivers[i].Delete();
  26.             //}   //这段是执行删除那些事件 
  27.             Console.WriteLine("It's OK");
  28.             Console.ReadLine();
  29.         }
  30.     }
  31. }

 

    对于上边  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

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值