使用Web服务代码更新sharepoint中的现有列表项值

时间:2014-12-29 15:39:54

标签: c# sharepoint sharepoint-2007

我有以下代码,我正在尝试运行以更新列表项值。 “设置”是列表名称,此列表中的项目的索引为1.

Main()
{
        ListsSoapClient client = new ListsSoapClient();            
        client.ClientCredentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials;
        client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
        string strListName = "Settings";           
        client.Open();           

        XElement listData = client.GetList(strListName);   
        string listID = listData.Attribute("ID").Value;
        string version = listData.Attribute("Version").Value;
        // string version = listData.Attribute("View").Value; Doesnt work





        // Method 1 : Make the call to SharePoint
        var listItems = client.GetListItems(strListName, null, null, null, null, null, null);
        List<XElement> results = listItems.Descendants().ToList();
        XElement updateItem = results[1];
        updateItem.SetAttributeValue("ows_Value", "value to update");
        client.UpdateListItems(strListName, updateItem); //Didnt work

        // Method 2 : Make the call to SharePoint
        string strBatch = "<Method ID='1' Cmd='Update'>" + 
                        "<Field Name='ID'>1</Field>" +
                        "<Field Name='Title'>" + "999" + "</Field></Method>"; 
        XmlDocument xmlDoc = new System.Xml.XmlDocument();
        System.Xml.XmlElement elBatch = xmlDoc.CreateElement("Batch");
        //elBatch.SetAttribute("OnError","Continue"); //Not mandatory ?
        //elBatch.SetAttribute("ListVersion","1"); //Not mandatory ?
        //elBatch.SetAttribute("ViewName", "00F85842-35AD-4AED-8DF7-0F903FB850BE"); is it mandatory ?

        elBatch.InnerXml = strBatch;
        client.UpdateListItems(strListName, XmlElementToXelement(elBatch)); //doesnt work
        client.Close();
  }

   public static XElement XmlElementToXelement(XmlElement e)
    {
        return XElement.Parse(e.OuterXml);
    }

我们如何使用代码获取列表的ViewName值?为什么它在方法2中不是必需的。在Method2中,列表项标题将被替换为值999.Whereas我想更新该列表项的值。

在方法1结束时,我得到以下异常。我该如何解决这个问题?

 Exception of type 'Microsoft.SharePoint.SoapServer.SoapServerException' was thrown.

1 个答案:

答案 0 :(得分:0)

有时出现此错误的原因是SOAP操作中的标头。您需要设置以下内容才能进行更新。:

beforeSend:function(xhr){xhr.setRequestHeader(“SOAPAction”,“http://schemas.microsoft.com/sharepoint/soap/UpdateListItems”);

我已创建以下函数以在Sharepoint列表中发送更新:

      var location = yoururl
      var listName = yourlistname  
      var command = "Update" // "Update" or "New"
      var fieldnames = ["ID","Title"];  //array with the fieldnames
      var fieldvalues = [value1,value2]; //array with the values

function sendupdates(location,listName,command,fieldnames,fieldvalues){
  var updatesvar;
  for(x=0;x<fieldnames.length;x++){
  updatesvar =   updatesvar + '<Field Name="'+fieldnames[x]+'">'+fieldvalues[x]+'</Field>'
     }

  var batchvar = '<Batch OnError="Continue" ListVersion="0"><Method ID="1" Cmd="'+command+'">'+updatesvar+'</Method></Batch>';

  var soapEnv =
              '<?xml version="1.0" encoding="utf-8"?>'+
              '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">'+
              '<soap:Body>'+
              '<UpdateListItems xmlns="http://schemas.microsoft.com/sharepoint/soap/">'+
              '<listName>'+listName+'</listName>'+
              '<updates>'+batchvar+'</updates>'+
              '</UpdateListItems>'+
              '</soap:Body>'+
              '</soap:Envelope>';

       $.ajax({
              url: location+"/_vti_bin/Lists.asmx",
              beforeSend: function(xhr) { xhr.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/sharepoint/soap/UpdateListItems");},
              type: "POST",
              dataType: "xml",
              data: soapEnv,
              complete: complete,   
              contentType: "text/xml; charset=\"utf-8\""
          });

}