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>