Доступ к веб-службе списков Sharepoint из .NET - PullRequest
0 голосов
/ 30 июля 2009

У меня есть форма InfoPath с пользовательским кодом отправки для обновления списка Sharepoint путем вызова веб-службы списков Sharepoint. Код выполняется без каких-либо исключений, и я смог установить точки останова, чтобы убедиться, что переменные содержат правильные значения перед отправкой в ​​веб-службу. Однако значения никогда не добавляются в список Sharepoint. Вот мой код:

[InfoPathEventHandler(MatchPath = "Submit", EventType = InfoPathEventType.OnClick)]
    public void Submit_OnClick(DocActionEvent e)
    {
        ListsService.Lists listService = new Risk_Form.ListsService.Lists();
        listService.Credentials = System.Net.CredentialCache.DefaultCredentials;

        string riskID = thisXDocument.DOM.selectSingleNode("//my:myFields/my:RiskID").text;
        string headline = thisXDocument.DOM.selectSingleNode("//my:myFields/my:RiskHeadline").text;

        XmlDocument doc = new XmlDocument();
        XmlElement batch = doc.CreateElement("Batch");
        batch.SetAttribute("OnError", "Continue");
        batch.SetAttribute("ListVersion", "1");

        batch.InnerXml = 
            "<Method ID='" + riskID + "' Cmd='New'>" +
                "<Field Name='RiskID'>" + riskID + "</Field>" +
                "<Field Name='Headline'>" + headline + "</Field>" + 
            "</Method>";
        try
        {
            // Update list using the list's GUID
            listService.UpdateListItems("2F6CA5F4-D78A-4716-B111-507917CF89E4", batch);
        }
        catch(Exception ex)
        {
            thisXDocument.DOM.selectSingleNode("//my:myFields/my:RiskStatement").text = ex.Message;
        }
    }

Ответы [ 4 ]

1 голос
/ 31 июля 2009

Хорошо, я наконец-то понял эту глупую ошибку. На корневом сайте Sharepoint был список с тем же отображаемым именем, что и список, к которому я пытался получить доступ на своем дочернем сайте. Несмотря на то, что моя ссылка на сервис указывала на веб-сервис Lists, расположенный на моем дочернем сайте, он все равно возвращал неправильный список. Я использовал внутреннее имя для своего списка, и теперь оно работает.

1 голос
/ 30 июля 2009

Две вещи:

  1. При вызове UpdateListItems () вам также может понадобиться идентификатор представления по умолчанию.

  2. Вместо жесткого кодирования списка, вы можете получить его программно, вызвав listService.GetListAndView ().

Вот код, демонстрирующий оба элемента:

System.Xml.XmlNode ndListView = listService.GetListAndView(DISPLAYNAMEOFLIST, "");
string listGuid = ndListView.ChildNodes[0].Attributes["Name"].Value;
string listView = ndListView.ChildNodes[1].Attributes["Name"].Value;

batch.SetAttribute("ViewName", listView);

Затем вы можете просто вызвать UpdateListItems () с помощью listGuid и batch.

0 голосов
/ 31 июля 2009

Я нашел частичный ответ на мою проблему. Когда я добавил сервисную ссылку на дочерний сайт, над которым я работаю, по какой-то причине app.config все еще содержал ссылку на корневой сайт Sharepoint. Поэтому список, который я искал, не существовал. Теперь у меня другая проблема. Я проверяю возвращаемое значение вызова UpdateListItems () и получаю следующую ошибку: «Один или несколько типов полей установлены неправильно. Перейдите на страницу настроек списка, чтобы удалить эти поля». Я искал вокруг, и все проблемы, которые вызывают эту ошибку, похоже, включают в себя имя поля с пробелом в нем. Однако ни на одном из моих полей нет пробелов. Вот мой обновленный код:

        ListsService.Lists listService = new Risk_Form.ListsService.Lists();
        listService.Credentials = System.Net.CredentialCache.DefaultCredentials;
        XmlNode list = null;

        list = listService.GetListAndView("Risks", "");

        string listID = list.ChildNodes[0].Attributes["Name"].Value;
        string viewID = list.ChildNodes[1].Attributes["Name"].Value;

        string riskID = thisXDocument.DOM.selectSingleNode("//my:myFields/my:RiskID").text;
        string headline = thisXDocument.DOM.selectSingleNode("//my:myFields/my:RiskHeadline").text;

        XmlDocument doc = new XmlDocument();
        XmlElement batch = doc.CreateElement("Batch");
        batch.SetAttribute("OnError", "Continue");
        batch.SetAttribute("ListVersion", "1");
        batch.SetAttribute("ViewName", viewID);

        batch.InnerXml = 
            "<Method ID='1' Cmd='New'>" +
                "<Field Name='RiskID'>" + riskID + "</Field>" +
                "<Field Name='Headline'>" + headline + "</Field>" + 
            "</Method>";

        XmlNode ret = listService.UpdateListItems(listID, batch);
        MessageBox.Show(ret.OuterXml);
0 голосов
/ 30 июля 2009

Из документации по MSDN : Рекомендуется использовать GUID списка, заключенный в фигурные скобки (т. Е. "{GUID}"), но вы также можете использовать отображаемое имя списка .

Эти фигурные скобки отсутствуют в вашем звонке.

...