我最近一直在从事SharePoint CSOM的工作,并且一直在处理文档库中的文件处理(上传/下载/元数据更新)。我遇到了几种获取文件的服务器相对url的方法,即listitem"FileRef“或listitem.ServerRelativeUrl。此链接一个链接提供了sharepoint字段的内部名称列表。请注意,它将“服务器相对URL”列为"ServerUrl“。然而,当我试图访问像listitem"ServerUrl“这样的东西时,会引发一个异常:
属性或字段尚未初始化。它没有被请求或者请求没有被执行。可能需要明确请求。
这是我的代码示例
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);
}
我有几个问题:
我对CSOM编程很陌生,所以请原谅我的无知。
谢谢
阿马尔
发布于 2017-09-28 07:11:30
首先,ServerRelativeUrl
只与File类一起工作。
所以,您的代码应该是listItem.File.ServerRelativeUrl.ToString();
关于你关于分歧的第一个问题,我认为它们都给出了相同的结果。这意味着,FileRef
、listItem.File.ServerRelativeUrl
和ServerUrl
为您提供文档库中文档的相同服务器相对路径。
关于第二个问题,在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());
}
}
https://stackoverflow.com/questions/46470713
复制相似问题