在preSave事件上更新SharePoint列表项导致保存冲突

时间:2015-03-12 15:19:37

标签: javascript c# asp.net sharepoint sharepoint-2013

我需要能够更新包含XML之前触发的SharePoint listitem事件的SharePoint listitem列。因此,当单击SharePoint保存按钮时,我更新preSave函数上的XML列,返回true以便SharePoint更新继续,但是,代码错误输出时出现以下异常: “拯救冲突          您的更改与另一个用户同时进行的更改冲突。如果要应用更改,请在Web浏览器中单击“上一步”,刷新页面,然后重新提交更改。“

我理解错误意味着什么以及它为什么会发生,我只是不知道解决方法。以下是我的代码中的代码片段:

  function PreSaveAction() {
     updateXML();
     return true;
  }

 // Update XML based on model
function updateXML() {
    // make an ajax call here to update listitem with updated xml.
     var xml= //UpdatedXML
    var DTO = { "p_xml": xml};
           $.ajax({
        type: "Post",
        url: "/_layouts/SharepointWebService/ePaymentService.asmx/ConvertModelToXML",
        async: false,
        contentType: "application/json; charset=utf-8",
        data: JSON.stringify(DTO),
        dataType: "json",
        success: function (msg) {
          alert(msg.d);
          },
        error: function (jqXHR, exception) {
           alert("error");
        }
    });
 }


   [WebMethod]
    public string ConvertModelToXML(string p_xml)
    {
        try
        {
              SPUserToken saUserToken = SPContext.Current.Site.SystemAccount.UserToken;
              using (SPSite ElevatedSite = new SPSite(HttpContext.Current.Request.UrlReferrer.AbsoluteUri, saUserToken))
        {
              using (SPWeb ElevatedWeb = ElevatedSite.OpenWeb())
                 {
                   ElevatedWeb.AllowUnsafeUpdates = true;
                   SPListItem item = //Get current list item
                   item["XMLcolumn"] = p_xml;
                   item.update();
                   ElevatedWeb.AllowUnsafeUpdates = false;
                   return "list updated";
                 }

        }
        catch (Exception p_ex)
        {
            return "Unable to Update listitem XML: " + p_ex.Message;
        }
        return "";
    }

这会执行,但只要它完成预先调用调用,SharePoint就会尝试进行更新,但它会因上述错误而失败。

有没有办法可以对ListItem的XML进行更新(因为我需要在事件接收器中使用它)并且仍然让SharePoint自己保存(更新)?

谢谢

1 个答案:

答案 0 :(得分:0)

您可以定义自己的事件接收器并为其指定sequence number,以便它在其他事件接收器之前运行。我知道你说你需要它在事件发生之前运行,但如果它在所有其他事件之前运行,它可能对你的用例来说已经足够了。

来自https://msdn.microsoft.com/en-us/library/office/gg749858(v=office.14).aspx

  

事件接收器序列
  事件接收器序列指定在事件触发多个事件接收器的情况下执行事件接收器的顺序。例如,如果有两个ItemAdded事件接收器绑定到同一个列表(一个来自Assembly“1”,另一个来自Assembly“2”),则首先执行绑定了较低序列号的事件接收器。一个实际的例子是将事件接收器添加到已经绑定了系统事件接收器的系统列表中。在这种情况下,您可以为新事件接收器分配更高的序列号。

通过这种方式,您可以定义“事件前同步”(如ItemAdding),以便它可以在其他可能修改项目的事件接收器之前运行,避免保存冲突。