.NETからSharepoint Lists Webサービスにアクセスする
-
05-07-2019 - |
質問
Sharepoint Lists Webサービスを呼び出してSharepointリストを更新するカスタム送信コードを含むInfoPathフォームがあります。コードは例外なく実行され、ブレークポイントを設定して、Webサービスに送信される前に変数に正しい値が含まれていることを確認できました。ただし、値が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
OK、私はついにこの愚かなバグを見つけ出しました。ルートSharepointサイトには、サブサイトでアクセスしようとしたリストと同じ表示名のリストがありました。私のサービス参照は、サブサイトにあるリストWebサービスを指していますが、それでも間違ったリストを返していました。リストに内部名を使用しましたが、現在は機能しています。
他のヒント
2つのこと:
-
UpdateListItems()を呼び出すときに、バッチ内のデフォルトのビューIDも必要になる場合があります。
-
リスト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);
その後、listGuidおよびbatchを使用してUpdateListItems()を呼び出すだけです。
MSDN のドキュメントから:< em>中括弧で囲まれたリストGUID(つまり、「{GUID}&quot;)を使用することをお勧めしますが、リストの表示名を使用することもできます。
これらの波括弧は、呼び出しで欠落しているようです。
問題に対する部分的な答えが見つかりました。作業中のサブサイトにサービス参照を追加したとき、何らかの理由でapp.configにルートSharepointサイトへの参照が含まれていました。したがって、私が探していたリストは存在しませんでした。しかし、今私は別の問題を抱えています。 UpdateListItems()呼び出しの戻り値を確認すると、次のエラーが表示されます。&quot; 1つ以上のフィールドタイプが正しくインストールされていません。リスト設定ページに移動して、これらのフィールドを削除します。&quot;私はあちこち検索しましたが、このエラーを引き起こすすべての問題には、フィールド名にスペースが含まれていることが関係しているようです。ただし、どちらのフィールドにもスペースはありません。更新されたコードは次のとおりです。
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);