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>


 

 

 

posted @ 2013-07-01 21:08  爱生活,爱编程  阅读(306)  评论(0编辑  收藏  举报