splisteventreceiver.listadded中的种族条件 - 保存冲突
-
16-10-2019 - |
题
我目前正在为SharePoint 2010开发一个事件处理程序,该事件处理程序为创建文档库设置默认值(内容类型,版本设置等)。通过GUI创建文档库时,我在保存冲突方面有问题,事件接收器并不总是在GUI完成保存列表后运行。
我以为 ListAdded
在GUI正确完成创建列表并保存列表之后,将被调用,但事实并非如此。我尝试在 ListAdding
功能,但没有保存更改(因为尚未创建列表)。
在Visual Studio中调试时,我会收到以下消息:
保存冲突。
您的更改与另一用户同时制造的更改冲突。如果您希望应用更改,请单击Web浏览器中的重新介绍,刷新页面并重新提交更改。
带有堆栈痕迹:
microsoft.sharepoint.spexception被用户代码错误码= -2130575305本机摩尔治疗=检测到失败的HR(HR = 0x81020037)
nativestacktrace =“”消息=保存冲突。
您的更改与另一用户同时制造的更改冲突。如果您希望应用更改,请单击Web浏览器中的重新介绍,刷新页面并重新提交更改。 source = microsoft.sharepoint stacktrace:在microsoft.sharepoint.spglobal.handlecomexception(comexception comex)上,请访问Microsoft.sharepoint.library.library.sprequest.setlistprops(string bstrurl,string bstrurl,string bmigrate bmigrate aitosoft.sharepoft.shararemoft.shararemoft.sharare) ) at Company.SharePoint.EventReceivers.ListCreate.CompanyListCreateEventReceiver.ListAdded(SPListEventProperties properties) at Microsoft.SharePoint.SPEventManager.RunListEventReceiver(SPListEventReceiver receiver, SPUserCodeInfo userCodeInfo, SPListEventProperties properties, String receiverData) at Microsoft.SharePoint.SPEventManager.RunListEventReceiverHelper(Object receiver, SPUserCodeInfo userCodeInfo, Object properties, SPEventContext context, String receiverData) at Microsoft.SharePoint.SPEventManager.<>c__DisplayClassc`1.b__6() at Microsoft.SharePoint.SPSecurity.RunAsUser(SPUserToken userToken, Boolean bResetContext, WaitCallback code, Object param) InnerException :system.runtime.interopservices.comex受到关注
和ULS日志:
02/25/2011 11:12:52.06 w3wp.exe(0x363c)0x219c SharePoint Foundation General 8E2S中等未知的Sprequest错误发生了。更多信息:0x8007047E F35857AF-3D3A-462C-86A6-DE24D3B3D8D33D8D3
02/25/2011 11:12:52.06 w3wp.exe (0x363C) 0x219C SharePoint Foundation General 72k4 Medium 0x8007047e f35857af-3d3a-462c-86a6-de24d3b3d8d3
02/25/2011 11:12:52.06 w3wp.exe (0x363C) 0x219C SharePoint Foundation General 8kh7 High 0x8007047e f35857af-3d3a-462c-86a6-de24d3b3d8d3
是否有一种方法可以确保不发生冲突,或者有一种设置或访问不会冲突的列表属性的不同方法。我疲倦地创建了Spsite/spweb的单独实例,但这仍然存在相同的问题。
失败的代码的一个简单示例是:
public class CompanyListCreateEventReceiver : SPListEventReceiver
{
public override void ListAdded(SPListEventProperties properties)
{
base.ListAdded(properties);
SPList l_list = properties.List;
l_list.Title = "Changed title";
l_list.Update();
}
}
任何帮助,将不胜感激。谢谢!
解决方案
您必须将ItemAdded事件注册为同步事件。SpeventReceiversynchronization.Synchronous
您可以以编程方式定义它:http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.speventreceiverdefinition.synchronization.aspx
或在功能定义的接收器元素中:http://msdn.microsoft.com/en-us/library/ff512765.aspx
其他提示
我已经与SharePoint事件接收器战斗了一段时间。在SharePoint IMO的这一部分中,许多陷阱和意外逻辑。
我以前从未见过这个确切的问题,但是我可以给您一个建议。根据我的经验,更改属性列表有时可能会遇到问题。这就是为什么我想从网络上获取列表的原因。如果失败(对我有用),请尝试从Web.url实例化新的SPWEB。
在这种情况下,我建议您尝试以下方法:
public class CompanyListCreateEventReceiver : SPListEventReceiver
{
public override void ListAdded(SPListEventProperties properties)
{
base.ListAdded(properties);
SPList l_list = properties.Web.Lists[properties.List.ID];
l_list.Title = "Changed Title";
l_list.Update();
}
}
我想,您可能需要在元素中指定“同步”。xml文件,请参阅 http://sharepointconnoisseur.blogspot.com/2011/04/save-conflict-error-when-when-creating-list.html
尝试使用禁用事件并启用事件方法。
2)(来自Event Handler的更新项目很有用)
Item[FieldName] = FieldValue;
this.DisableEventFiriing();
item.SystemUpdate(false);
or
item.Update();
this.EnableEventFiring();
//must enable event firing if we are disable it