在SPItemEventReceiver中使用BeforeProperties和AfterProperties
来源:互联网 发布:网络贷款平台排名 编辑:程序博客网 时间:2024/06/18 16:01
当你利用这些事件时,就很快会发现存在前(同步)后(异步)两种事件。其方法的后缀分别为“ing”(比如,ItemAdding)和“ed”(比如,ItemAdded),分别代表了变更发生前调用和发生后调用。这些都是最基本的东西。
接下来,当你更深入时甚至发现,你可以提取变更前和变更后的状态变化。比如,我们可以挂接到一个文档库的ItemUpdating事件上,来阻止用修改某个特定的字段。其代码大致如下:
public override void ItemUpdating(SPItemEventProperties properties) { if (properties.BeforeProperties["column"] != properties.AfterProperties["column"]) { properties.Cancel = true; properties.ErrorMessage = "该栏不允许修改"; } }
对于文档库而言,该代码运行良好。然而,你应该知道,BeforeProperties哈希表对于列表项来说并不公开。用SDK中的原话说:“对于文档,Before 和 After 属性可为发布事件(例如 ItemUpdated)提供保证,但 Before 属性不能用于有关列表项的发布事件。”。
当他们说“不能用于有关列表项的发布事件”时,意思是说在后事件(比如 ItemUpdated,ItemDeleted等)中不可用吗?这里词语表述不是很清楚,因此我决定花点时间测试一下各种常见事件(像添加,修改和删除)与列表和库的组合。每个测试包括了添加一个新项,编辑该项,然后删除该项。下面是对列表的测试结果:
列表BeforePropertiesAfterPropertiesproperties.ListItemItemAdding没值新值空ItemAdded没值新值新值ItemUpdating没值更改的值老值ItemUpdated没值更改的值更改的值ItemDeleting没值没值老值ItemDeleted没值没值空“没值”的意思是该栏的值在哈希表中不可用。
“新值”的意思是该栏当前的值是可用的。
“更改的值”的意思是该栏修改后的值是可用的。
“老值”的意思是该栏在修改前的值是可用的。
下面是对于文档库的测试结果:
文档库BeforePropertiesAfterPropertiesproperties.ListItemItemAdding没值没值空ItemAdded没值没值新值ItemUpdating老值更改的值老值ItemUpdated老值更改的值更改的值ItemDeleting没值没值老值ItemDeleted没值没值空Properties.ListItem是指列表项在事件中当前的值。空表示该项不可用。通过我的分析得到如下结论:
毫不奇怪,我们在ItemAdding(在项被添加前)和ItemDeleted(在项被删除后)得到的是空值。之前Lshai Sagi也证明过这一点。
正如SDK中记载的,对于列表项事件不公开BeforeProperties。
对于列表项而言ItemAdding 和ItemAdded正确返回了AfterProperties的值,而对于库文件则无效。这一点很有意思。
通过之前的实验发现,在ItemDeleted中没有任何可用的值。这也很明显,一旦删除了就彻底消失了。
因此,如果再回到我们原来的问题上,如何防止用户在列表项的事件中修改某一栏的值?对于列表而言,你可以看到,如果挂在ItemUpdating事件上,我们可以对当前列表项的值(properties.ListItem)和AfterProperties的值进行比较。代码如下:
if (properties.ListItem["column"] != properties.AfterProperties["column"]){ properties.Cancel = true; properties.ErrorMessage = "该栏不允许修改";}
本文中我们为你使用列表和文档库前后事件提出一些好的建议。希望能看到你的更好的想法或反馈。
http://school.21tx.com/2010/08/24/12239.html
- 在SPItemEventReceiver中使用BeforeProperties和AfterProperties
- 在SPItemEventReceiver中使用BeforeProperties和AfterProperties
- 【飞秋】在SPItemEventReceiver中使用BeforeProperties和AfterProperties
- 转:在SPItemEventReceiver中使用BeforeProperties和AfterProperties
- Working with BeforeProperties and AfterProperties on SPItemEventReceiver
- Event handler DisableEventFiring EnableEventFiring BeforeProperties AfterProperties
- [转]烦人的BeforePropertie----BeforeProperties,AfterProperties,properties.ListItem
- EventHandler之SPItemEventReceiver
- 在Dialog中使用Menu和Toolbar
- 在Mozilla中使用XML和JavaScript
- 在请求和响应中使用 XML
- 在Dialog中使用Menu和Toolbar
- 在Servlet中使用include和forward。
- 在Dialog中使用Menu和Toolbar
- 在VC中编译和使用OpenSSL
- 在Dialog中使用Menu和Toolbar
- 在VC中编译和使用OpenSSL
- 在Mozilla中使用XML和JavaScript
- c++智能指针auto_ptr和shared_ptr
- SQL Server 2005数据表导出到Oracle的方案 .
- javascript 小技巧
- Chartboost-x新鲜出炉: C++ Wrapper of Chartboost for Cocos2d-x
- 常用网址
- 在SPItemEventReceiver中使用BeforeProperties和AfterProperties
- Oracle PL\SQL操作(二)
- ExtJs中Grid加载数据的超时时间的设置!(详细)
- 我的Java开发学习之旅------>Java金额大小写的转换
- 深入浅出FFMPEG(一) SDK version 0.11
- 指定tomcat发布项目的位置
- js实现身份证号码验证
- init.rc on property:vold.decrypt=trigger_reset_main 过程
- kaifang系统 MFC读取文件