2017-09-28 3 views
0

最近私はSharePoint CSOMで作業しており、ドキュメントライブラリ(アップロード/ダウンロード/メタデータの更新)でのファイル処理を扱っています。私は、サーバーの相対URL、すなわちlistitem ["FileRef"]またはlistitem.ServerRelativeUrlを取得するためのいくつかの方法に遭遇しました。このリンクa linkは、共有ポイントフィールドの内部名のリストを提供します。 「Server Relative URL」は「ServerUrl」と表示されています。しかし、私がlistitem ["ServerUrl"]のようなものにアクセスしようとすると例外がスローされます:CSOM - FileRef vs ServerUrl vs sp.listitem.ServerRelativeUrl

プロパティまたはフィールドが初期化されていません。要求されていないか、要求が実行されていません。明示的に要求される必要があるかもしれません。

HERESに私のコードサンプル

using (ClientContext clientContext = new ClientContext(siteUrl)) 
{ 
clientContext.Credentials = new NetworkCredential("abc", "abc", "cde"); 
List oList = clientContext.Web.Lists.GetByTitle("abcd"); 
clientContext.Load(oList); 
clientContext.ExecuteQuery(); 
CamlQuery camlQuery = new CamlQuery(); 

ListItemCollectionPosition itemPosition = null; 

conn.Open(); 
while (true) 
{ 
    camlQuery = new CamlQuery(); 
    camlQuery.ListItemCollectionPosition = itemPosition; 

     camlQuery.ViewXml = 
      //@"<View Scope='RecursiveAll'> 
      string.Format(@"<View Scope='RecursiveAll'> 
          <Query> 
           <Where> 
            <And> 
             <Eq> 
              <FieldRef Name='FSObjType' /> 
              <Value Type='Integer'>0</Value> 
             </Eq> 
             <In> 
              <FieldRef Name='FileLeafRef' /> 
              <Values> 
               {0} 
              </Values> 
             </In>         
            </And> 
           </Where> 
          </Query> 
          <FieldRef Name='FileLeafRef' /><FieldRef Name='FileRef'><FieldRef Name='ServerUrl'> 
          <RowLimit>100</RowLimit> 
          </View>", CAMLcoll); 

    ListItemCollection listItems = oList.GetItems(camlQuery); 

    clientContext.Load(listItems); 
    clientContext.ExecuteQuery(); 
    itemPosition = listItems.ListItemCollectionPosition; 

    foreach (ListItem listItem in listItems) 
    { 
     try 
     { 
      clientContext.Load(listItem, eachitem => eachitem.File.ServerRelativeUrl); 
      clientContext.ExecuteQuery(); 
      string url = listItem["FileRef"].ToString(); //This works 
      url = listItem.ServerRelativeUrl.ToString(); //This works 
      url = listItem["ServerUrl"].ToString(); //This throws exception!! 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
    } 
    if (itemPosition == null) 
     break; 
    //Debug.Print(itemPosition.PagingInfo); 
} 

私は質問のカップルを持っている:

  1. 項目サーバー相対URLにアクセスして、これらの3つの方法の違いは何ですか?

  2. なぜですかurl = listItem ["ServerUrl"] ToString()は失敗しますか?

私はCSOMプログラミングにはかなり新しいので、私の無知のために私を失礼です。

おかげ

アマール

答えて

1

のみFileクラスを持つすべてのServerRelativeUrl作品の最初の。

だから、あなたのコードが違いに関連したあなたの最初の質問についてはlistItem.File.ServerRelativeUrl.ToString();

する必要があり、私は彼らがすべて同じ結果を与えると思います。つまり、FileRef,listItem.File.ServerRelativeUrlおよびServerUrlは、ドキュメントライブラリ内のドキュメントの同じサーバー相対パスを提供します。

2番目の質問については、SharePoint CSOMで、利用するプロパティを明示的に読み込む必要があります。いくつかの基本プロパティが用意されていますが、ServerUrlのような他のプロパティの場合は、明示的にロードして使用できるようにする必要があります。

第3に、コードが実行され、各リスト項目のデータを要求しています。これは単に必要ではありません。これらのプロパティは、リストアイテムコレクションに読み込むことができます。

コードを変更、簡略化、最適化しました。見てください:

ListItemCollection listItems = oList.GetItems(camlQuery); 
clientContext.Load(listItems,items => items.Include(
         item => item["FileRef"], 
         item => item.File.ServerRelativeUrl, 
         item => item["ServerUrl"])); 
clientContext.ExecuteQuery(); 

itemPosition = listItems.ListItemCollectionPosition; 

foreach (ListItem listItem in listItems) 
{ 
    try 
    { 

     string url = listItem["FileRef"].ToString(); //This works 
     url = listItem.File.ServerRelativeUrl.ToString(); //This should work 
     url = listItem["ServerUrl"].ToString(); //This will work now 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString()); 
    } 
} 
+0

ありがとうGautam。 はい、あなたは正しいです、ServerRelativeUrlはファイルプロパティであり、アイテムプロパティをリストしません。私はポストのコードを修正しようとしている間にそれを逃した。 – Amar