2009-07-30 14 views
0

Sharepoint List Webサービスを呼び出すことによってSharepointリストを更新するカスタム送信コードを持つInfoPathフォームがあります。コードは例外なく実行され、ブレークポイントを設定して、Webサービスに送信する前に変数に正しい値が含まれていることを確認できました。ただし、値はSharepointリストには追加されません。ここに私のコードは次のとおりです。.NETからSharepointリストWebサービスにアクセスする

[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; 
     } 
    } 
+0

まだ投票を締め切っていないか、投票には投票していませんが、質問をするのを忘れましたか? –

+0

よろしくお願いします。編集されました。 – Jared

答えて

1

私はついにこの愚かなバグを見つけました。ルートSharepointサイトに、サブサイトでアクセスしようとしていたリストと同じ表示名のリストがありました。私のサービス参照は、私のサブサイトにあるLists Webサービスを指していましたが、それでも間違ったリストを返していました。私は私のリストの内部名を使用し、今それは動作します。

0

MSDNのドキュメントから:あなたが中括弧(すなわち、「{GUID}」)で囲まれたリストのGUIDを使用することをお勧めしますが、あなたはまた、リスト表示を使用することができます名。

あなたの呼び出しでは、これらの中括弧が欠落しているようです。

+0

うん、私もそれに気がついたが、私はどちらかと一緒に試してみたが、それは違いがないようだ。 – Jared

1

2つのこと:()UpdateListItemsを呼び出すとき

  1. はまた、あなたのバッチで、デフォルトのビューのIDが必要になる場合があります。

  2. list 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とバッチとUpdateListItems()を呼び出すことができます。

0

私の問題に対する部分的な答えが見つかりました。私が作業しているサブサイトにサービス参照を追加したとき、何らかの理由でapp.configには依然としてルートSharepointサイトへの参照が含まれていました。したがって、私が探していたリストは存在しませんでした。しかし、私は別の問題を抱えています。 UpdateListItems()呼び出しの戻り値を確認し、次のエラーが表示されます。「1つ以上のフィールドタイプが正しくインストールされていません。リスト設定ページに移動してこれらのフィールドを削除してください。私は周りを検索し、このエラーの原因となるすべての問題には、フィールド名にスペースが含まれているように見えます。しかし、私のフィールドにはスペースがありません。ここに私の更新されたコードがあります:

 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); 
+1

このエラーは、リストにないwhere句のフィールドを含むクエリを実行すると発生します。 – Colin

+0

私は何も照会していませんが、バッチXMLで参照するフィールドは両方存在します。また、リスト内のすべてのアイテムのRiskIDフィールドにアクセスしようとするGetListItemsの同様の呼び出しを試みましたが、同じエラーが発生します。 – Jared

関連する問題