Javascript 在导致保存冲突的preSave事件上更新SharePoint列表项
我需要能够在触发SharePoint listitem事件之前更新包含XML的SharePoint listitem列。因此,当单击“SharePoint保存”按钮时,我会更新preSave函数上的XML列,并返回true以继续SharePoint更新,但是,代码会出错,出现以下异常: “拯救冲突 您的更改与其他用户同时进行的更改冲突。如果要应用您的更改,请单击Web浏览器中的“上一步”,刷新页面,然后重新提交更改。“ 我理解错误的含义和发生的原因,我只是不知道如何解决。下面是我代码中的一个片段:Javascript 在导致保存冲突的preSave事件上更新SharePoint列表项,javascript,c#,asp.net,sharepoint,sharepoint-2013,Javascript,C#,Asp.net,Sharepoint,Sharepoint 2013,我需要能够在触发SharePoint listitem事件之前更新包含XML的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 "";
}
这会执行,但一旦完成presave调用,SharePoint就会尝试执行其更新,并失败,出现上述错误
是否有一种方法可以更新ListItem的XML(因为我需要在事件接收器中使用它),并且仍然让SharePoint自己保存(更新)
谢谢您可以定义自己的事件接收器,并给它一个优先级,以便它在其他事件接收器之前运行。我知道您说过您需要它在事件之前运行,但是如果它在所有其他事件之前运行,那么它对于您的用例来说就足够了 发件人: 事件接收器序列
事件接收器序列指定在事件触发多个事件接收器的情况下执行事件接收器的顺序。例如,如果有两个ItemAdded事件接收器绑定到同一列表(一个来自程序集“1”,另一个来自程序集“2”),则首先执行与较低序列号绑定的事件接收器。一个实际示例是将事件接收器添加到已绑定了系统事件接收器的系统列表中。在这种情况下,将为新事件接收器分配更高的序列号
通过这种方式,您可以定义“事件前同步”(如
itemsadding
),以便它在其他可能修改项目的事件接收器之前运行,从而避免保存冲突。感谢您的响应。我需要在任何事件接收器之前更新XMl的原因是,我将使用该XMl填充其他列表和列,更新后的XMl仅在UI上可用,所以这就是我试图在到达事件之前更新列的原因,在“ItemUpdate”中也是如此我可以使用afterproperties来获取更新的xml。我明白了。我认为PreSaveAction
主要用于验证。如果您希望保持客户端和服务器端数据同步,那么一个选项是为您关心的状态钩住更改事件,当它们更改时,您可以更新关联项的xml列。这避免了在PreSaveAction
中保存时发生的两次并发保存。我应该只在保存时更新XML,而不是在进行更改时更新,因为总有可能有人在屏幕上进行更改,然后点击取消。。。