正如你所知道的,事件接收器(EventHandler)非常强大,可以挂在许多SharePoint事件上。它们可以应用于功能 (Feature)事件,如FeatureActivated,列表事件,如FIEldAdded,等等。然而,其中我们最常用的还是 SPItemEventReceiver中的一系列接收器。通过继承该类,我们可以把自己的代码挂接在列表项或文档库文档上发生的一系列事件上。
当你利用这些事件时,就很快会发现存在前(同步)后(异步)两种事件。其方法的后缀分别为“ing”(比如,ItemAdding)和“ed”(比如,ItemAdded),分别代表了变更发生前调用和发生后调用。这些都是最基本的东西。
接下来,当你更深入时甚至发现,你可以提取变更前和变更后的状态变化。比如,我们可以挂接到一个文档库的ItemUpdating事件上,来阻止用修改某个特定的字段。其代码大致如下:
1 public override void ItemUpdating(SPItemEventProperties properties)
2 {
3 if (properties.BeforeProperties["column"] != properties.AfterProperties["column"])
4 {
5 properties.Cancel = true;
6 properties.ErrorMessage = "该栏不允许修改";
7 }
8 }
对于文档库而言,该代码运行良好。然而,你应该知道,BeforeProperties哈希表对于列表项来说并不公开。用SDK中的原话说:“对于文档,Before 和 After 属性可为发布事件(例如 ItemUpdated)提供保证,但 Before 属性不能用于有关列表项的发布事件。”。
当他们说“不能用于有关列表项的发布事件”时,意思是说在后事件(比如 ItemUpdated,ItemDeleted等)中不可用吗?这里词语表述不是很清楚,因此我决定花点时间测试一下各种常见事件(像添加,修改和删除)与列表和库的组合。每个测试包括了添加一个新项,编辑该项,然后删除该项。下面是对列表的测试结果:
列表 | BeforeProperties | AfterProperties | properties.ListItem |
ItemAdding | 没值 | 新值 | 空 |
ItemAdded | 没值 | 新值 | 新值 |
ItemUpdating | 没值 | 更改的值 | 老值 |
ItemUpdated | 没值 | 更改的值 | 更改的值 |
ItemDeleting | 没值 | 没值 | 老值 |
ItemDeleted | 没值 | 没值 | 空 |