2017-09-28 39 views
0

我最近一直在研究SharePoint CSOM,并且一直在处理文档库中的文件处理(上传/下载/元数据更新)。我遇到了几种方法来获取文件的服务器相对URL,即listitem [“FileRef”]或listitem.ServerRelativeUrl。此链接a link提供了sharepoint字段的内部名称列表。请注意,它将“服务器相对URL”列为“ServerUrl”。但是,当我尝试访问像listitem [“ServerUrl”]时抛出异常:CSOM - FileRef vs ServerUrl vs sp.listitem.ServerRelativeUrl

属性或字段尚未初始化。它没有被请求或者请求没有被执行。可能需要明确要求。

继承人我的代码示例

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

首先在ServerRelativeUrl作品只能用File类的。

所以,你的代码应该是listItem.File.ServerRelativeUrl.ToString();

关于你提到的有关差异的第一个问题,我觉得他们都给予同样的结果。这意味着,FileReflistItem.File.ServerRelativeUrlServerUrl为您提供了文档库中文档的相同服务器相对路径。

关于第二个问题,在SharePoint CSOM中,您需要明确加载要使用的属性。提供了一些基本属性,但对于某些其他属性,例如在您的情况下ServerUrl,您需要显式加载它,以便您可以使用它。

第三,您的代码正在执行并为每个列表项请求数据。这根本就不需要。您可以在列表项集合中加载这些属性。

修改,简化并优化了您的代码。看一看:

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

谢谢高塔姆。 是的你是对的,ServerRelativeUrl是文件属性,而不是列表项属性。我在尝试修改帖子的代码时错过了它。 – Amar

相关问题