正如你所知道的,事件接收器(EventHandler)非常强大,可以挂在许多SharePoint事件上。它们可以应用于功能(Feature)事件,如FeatureActivated,列表事件,如FieldAdded,等等。然而,其中我们最常用的还是SPItemEventReceiver中的一系列接收器。通过继承该类,我们可以把自己的代码挂接在列表项或文档库文档上发生的一系列事件上。

当你利用这些事件时,就很快会发现存在前(同步)后(异步)两种事件。其方法的后缀分别为“ing”(比如,ItemAdding)和“ed”(比如,ItemAdded),分别代表了变更发生前调用和发生后调用。这些都是最基本的东西。

接下来,当你更深入时甚至发现,你可以提取变更前和变更后的状态变化。比如,我们可以挂接到一个文档库的ItemUpdating事件上,来阻止用修改某个特定的字段。其代码大致如下:

view sourceprint?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 没值 没值 空

“没值”的意思是该栏的值在哈希表中不可用。

“新值”的意思是该栏当前的值是可用的。

“更改的值”的意思是该栏修改后的值是可用的。

“老值”的意思是该栏在修改前的值是可用的。

下面是对于文档库的测试结果:

文档库 BeforeProperties AfterProperties properties.ListItem
ItemAdding 没值 没值  空
ItemAdded 没值 没值 新值
ItemUpdating 老值 更改的值 老值
ItemUpdated 老值 更改的值 更改的值
ItemDeleting 没值 没值 老值
ItemDeleted 没值 没值 空

Properties.ListItem是指列表项在事件中当前的值。空表示该项不可用。通过我的分析得到如下结论:

毫不奇怪,我们在ItemAdding(在项被添加前)和ItemDeleted(在项被删除后)得到的是空值。之前Lshai Sagi也证明过这一点。

正如SDK中记载的,对于列表项事件不公开BeforeProperties。

对于列表项而言ItemAdding 和ItemAdded正确返回了AfterProperties的值,而对于库文件则无效。这一点很有意思。

通过之前的实验发现,在ItemDeleted中没有任何可用的值。这也很明显,一旦删除了就彻底消失了。

因此,如果再回到我们原来的问题上,如何防止用户在列表项的事件中修改某一栏的值?对于列表而言,你可以看到,如果挂在ItemUpdating事件上,我们可以对当前列表项的值(properties.ListItem)和AfterProperties的值进行比较。代码如下:

view sourceprint?1 if (properties.ListItem["column"] != properties.AfterProperties["column"])

2 {

3     properties.Cancel = true;

4     properties.ErrorMessage = "该栏不允许修改";

5 }

本文中我们为你使用列表和文档库前后事件提出一些好的建议。希望能看到你的更好的想法或反馈。

参考资料

关注技术文章飞秋:http://www.freeeim.com/,24小时专业转载。

【飞秋】在SPItemEventReceiver中使用BeforeProperties和AfterProperties相关推荐

  1. 飞秋(FeiQ)2012版择日发布

    作为飞秋作者,飞秋2012快发布了!我非常感谢大家一直对飞秋的支持,飞秋FeiQ时隔三年多又回来了!!! 非常感谢大家一直对飞秋的关心和关注!!! 经过一段时间的努力,飞秋2012测试版终于出炉了!! ...

  2. 两台电脑直连传输文件的方法-飞秋

    在对计算机硬盘重新分区或者在两台电脑之间进行资料转移时,用U盘或者硬盘速度不够快,最简单的方法是两台计算机用网线直接相连,组成局域网,使用飞秋传输数据. 1.将两台电脑用网线连接 2.两台电脑分别装上 ...

  3. 不通人情世故的 飞秋官方下载 短处中

    因为韩幌从这位年轻人不通人情世故的 飞秋官方下载 短处中,看到了他铁面无私.刚直不阿的长处,于是任命他为监库门.年轻人上任之后,恪尽职守,库亏之事极少发生.清代有位将军叫杨时斋,他认为军营中没有无用之 ...

  4. 代码中有的《飞秋》只是一个照面

    在工作过程中认识不少人,有的飞秋只是一个照面,有的是我人生中的贵人.每一段相识,无论长短,都是一段缘分,需要好好珍惜.年初的时候,领导给我的业务线分配了一个实习生,花名叫元平,元平我觉得还是挺有悟性的 ...

  5. 今天说说微博中的“飞秋下载”

    微博中的"飞秋下载",所谓的超链接其实也是经过转换后的链接,产生这样链接的原因在于"授权站的同步".在其他OpenEIM中发布一条信息,便会被同步上去.如果反复 ...

  6. 【飞秋】使用C++语言创建Silverlight中的VisualState

    Silverlight中的VisualState(可视状态)是一个非常重要的概念,使用VisualState,可以将界面的各个状态进行有效的区隔开,并进行单独的设计,并且可以在状态切换时实现动画效果, ...

  7. 『飞秋』在ASP.NET服务器端过程中使用WebBrowser的注意事项

    昨天刚刚完成了一个从网页上提取内容的ASP.NET程序.因为目标网页内容比较复杂,所以采用了WebBrowser来代替WebClient. 但是,在本地写好的程序,放到了服务器上就停止工作了,也找不到 ...

  8. 『飞秋』在.NET 4中调用GDAL库时遇到的问题及解决方法

    『飞秋』在.NET 4中调用GDAL库时遇到的问题及解决方法 最近需要在.NET 4的环境中调用GDAL库.GDAL本身是一套非托管类库,不过还好提供了用SWIG做的托管的Wrapper. 可以在FW ...

  9. 飞秋 公司在发展过程中

    飞秋 公司负责人曾经制作过众所周知的流氓软件IPMSG,劫持用户浏览器而且用户无法进行卸载.这毫无疑问应该受到谴责,而且已被广为谴责过.根据指控,飞秋 公司在发展过程中,挥舞安全大棒打击了多家软件公司 ...

最新文章

  1. 使用nsenter进入docker namespace
  2. css 中 border 断线解决,简单实用
  3. UNIX再学习 -- 信号处理
  4. Java接口、implements关键字、接口中抽象方法,默认方法,静态方法,私有方法,常量、final关键字
  5. SpringMVC 中整合JSON、XML视图二
  6. P1879 [USACO06NOV]玉米田Corn Fields
  7. SQL Server 2008 r2数据库可疑状态解决
  8. ListView分页显示数据
  9. 加载类型库/DLL 时出错。 (Exception from HRESULT: 0x80029C4A (TYPE_E_CANTLOADLIBRARY)
  10. AI的10个开源工具/框架
  11. 1.机器学习的重要性
  12. 自己做量化交易软件(20)通达信公式选股程序的实现
  13. 计应java1803_[南开大学]18秋学期(1709、1803、1809)《古代汉语(一)》在线作业 ......
  14. 北京三里屯苹果店悼念乔布斯:“黄牛”也献花
  15. Java 编程问题:四、类型推断
  16. 如何甄别有价值的数据
  17. composer global require fxp/composer-asset-plugin:1.0.0的Not enough arguments解决
  18. keras使用plot_model绘制网络模型图
  19. 二选一的时候到了,Qt Widgets 还是 Qt Quick ? 致Qt开发伙伴
  20. 第22课:打包和发布 Electron 应用

热门文章

  1. kibana客户端工具操作ElasticSearch(增删改查三)
  2. Linux下安装ElasticSearch-head插件
  3. 互联网日报 | 5月4日 星期二 | 水滴公司启动上市路演;蔚来汽车累计交付量突破10万里程碑;巴菲特透露接班人选
  4. 互联网日报 | 苹果首款自研芯片M1亮相;酷派主动终止与小米专利侵权诉讼;橙心优选日订单破700万...
  5. LeetCode刷题——整数反转
  6. qt5 linux 窗口不能置顶_Qt 5.15 LTS发布,Qt 6要来了
  7. 作者:包阳(1978-),男,北京系统工程研究所副研究员。
  8. 数博会重磅活动:第二届大数据科学与工程国际会议详细日程
  9. 作者:靳小龙,中国科学院计算技术研究所副研究员,博士生导师。
  10. 线段覆盖(洛谷P1803题题解,C++语言描述)