Доступ к веб-службе списков Sharepoint из .NET
-
05-07-2019 - |
Вопрос
У меня есть форма InfoPath с пользовательским кодом отправки для обновления списка Sharepoint путем вызова веб-службы Sharepoint Lists.Код выполняется без каких-либо исключений, и я смог установить точки останова, чтобы убедиться, что переменные содержат правильные значения перед отправкой в веб-службу.Однако значения никогда не добавляются в список 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;
}
}
Решение 2
Ладно, я наконец-то разобрался с этой дурацкой ошибкой.На корневом сайте Sharepoint был список с тем же отображаемым именем, что и список, к которому я пытался получить доступ на моем дочернем сайте.Несмотря на то, что моя ссылка на сервис указывала на веб-службу Lists, расположенную на моем дочернем сайте, она все равно возвращала неправильный список.Я использовал внутреннее имя для своего списка, и теперь это работает.
Другие советы
Две вещи:
Вам также может понадобиться идентификатор представления по умолчанию в вашем пакете при вызове UpdateListItems().
Вместо жесткого кодирования guid списка вы можете получить его программно, вызвав 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 .
Из документации по MSDN: Рекомендуется использовать GUID списка, заключенный в фигурные скобки (например, "{GUID}"), но вы также можете использовать отображаемое имя списка.
Эти фигурные скобки, похоже, отсутствуют в вашем вызове.
Я нашел частичный ответ на свою проблему.Когда я добавил ссылку на службу на дочерний сайт, над которым я работаю, по какой-то причине 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);