SharePoint 2010 用Event Receiver将文件夹自动变成approved状态 (2)

接上篇,先贴ItemUpdated的代码:

		base.ItemUpdated(properties);

                if (properties.ListItem.FileSystemObjectType != SPFileSystemObjectType.Folder)
                    return;

                if (properties.ListItem.ModerationInformation.Status == SPModerationStatusType.Approved)
                    return;

                SPSecurity.RunWithElevatedPrivileges(delegate
                {
                    SPListItem item = properties.ListItem;
                    SPModerationInformation approverInfo = item.ModerationInformation;
                    if (approverInfo != null)
                    {
                        if (approverInfo.Status != SPModerationStatusType.Approved)
                        {
                            approverInfo.Status = SPModerationStatusType.Approved;
                            try
                            {
                                this.EventFiringEnabled = false;
                                item.Update();
                            }
                            finally
                            {
                                this.EventFiringEnabled = false;
                            }
                        }
                    }
                });


代码里需要注意的地方,是调用了EventFiringEnabled属性,作用是防止重复触发ItemUpdated事件,其他的很好理解。如果就此将该代码部署到环境中,会发现修改文件夹名称后,文件夹的状态依然是draft状态,调式代码,会发现当运行到item.Update() 这行时,会提示找不到该item!原因是什么呢?

首先ItemAdded,ItemUpdated从字面上理解,都是过去时,即对象被添加之后和被更新之后才运行该代码,都是异步运行时,当文件夹修改了名称后,它的版本会更新,但是代码里取的还是修改名称之前的版本,这样就会找不到该item,而ItemAdded就没有版本问题。

解决方法是在Event Receiver 对应的elements.xml里将该事件强制切换成同步事件。

    <Receiver>
      <Name>EventReceiver2ItemUpdated</Name>
      <Type>ItemUpdated</Type>
      <Assembly>$SharePoint.Project.AssemblyFullName$</Assembly>
      <Class>AutoApproveFolder.EventReceiver2.EventReceiver2</Class>
      <SequenceNumber>10000</SequenceNumber>
      <Synchronization>Synchronous</Synchronization>
    </Receiver>


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值