我目前正在为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();

        }
}

任何帮助,将不胜感激。谢谢!

有帮助吗?

解决方案

其他提示

我已经与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
许可以下: CC-BY-SA归因
scroll top