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>


 

 

 

你可能感兴趣的:(SharePoint)