我正在使用Microsoft.SharePoint.Client库的16.0.0.0版。 SharePoint网站中有几个不同的文档库。在代码中,我们会得到一个文档URL列表(包含文档GUID),并需要确定每个文档库位于哪个文档库中,包括子文件夹(如果它位于库中的文件夹中)。
文档ID(GUID) - 从文档url查询参数“sourcedoc”收集 例如:“http://mycompany.sharepoint.com/spsite/_layouts/15/WopiFrame.aspx?action=default&file=testfile.docx&sourcedoc= {6A290A65-4759-41ED-A13E-3333B45DF133}”
using SP = Microsoft.SharePoint.Client;
public class LibraryAndFolderInfo
{
public LibraryAndFolderInfo();
public string FolderName { get; set; }
public string FolderUrl { get; set; }
public string LibraryName { get; set; }
public string LibraryBaseUrl { get; set; }
}
public class SPDataAccess
{
public LibraryAndFolderInfo GetLibraryAndFolderInfo(Guid documentGuid)
{
SP.File file = Web.GetFileById(documentGuid);
Context.Load(file);
if (file != null)
{
Context.Load(file.ListItemAllFields);
Context.ExecuteQuery();
SP.ListItem item = file.ListItemAllFields;
Context.Load(item.ParentList);
Context.ExecuteQuery();
SP.List list = item.ParentList;
Context.Load(list);
Context.ExecuteQuery();
Context.Load(item.Folder);
Context.ExecuteQuery();
SP.Folder folder = item.Folder;
Context.Load(folder);
Context.ExecuteQuery();
LibraryAndFolderInfo lib = new LibraryAndFolderInfo();
lib.LibraryName = list.Title;
lib.LibraryBaseUrl = list.DefaultViewUrl;
lib.FolderName = folder.Name;
lib.FolderUrl = folder.ServerRelativeUrl;
return lib;
}
return null;
}
protected SP.ClientContext Context { get; set; }
}
代码当前在此行失败:Context.Load(item.ParentList);
,并出现以下错误:
属性或字段'标题'尚未初始化。尚未请求或请求尚未执行。可能需要明确要求。
at Microsoft.SharePoint.Client.ClientObject.CheckUninitializedProperty(String propName)
在Microsoft.SharePoint.Client.List.get_Title()
在MyNamespace.SPDataAccess.GetLibraryAndFolderInfo(Guid documentGuid)的c:\ path \ SPDataAccess.cs:第27行
这一行似乎试图在加载和失败时检索列表的标题。这是正确的假设吗?
我对如何加载属性并不是非常熟悉,因此失败行之后的所有内容都是我最好的猜测它是如何工作的。
这段代码应该是什么样的?还有其他人试图从文档中获取此信息吗?
答案 0 :(得分:1)
下面提供了代码的一些更正,修复和注意事项:
1)条件if (file != null)
不正确,因为不可用于确定文件是否存在。以下示例演示了如何验证文件是否已加载:
SP.File file = Context.Web.GetFileById(documentGuid);
Context.Load(file);
Context.ExecuteQuery();
if (file.ServerObjectIsNull != null)
{
//File has been loaded..
}
2)item.Folder
不返回parent
文件夹,它会将Folder
关联与List Item
一起返回是不一样的
如何返回文件的parent
文件夹?
var file = Context.Web.GetFileById(documentGuid);
Context.Load(file,i => i.ListItemAllFields);
Context.ExecuteQuery();
var folder = Context.Web.GetFolderByServerRelativeUrl((string)file.ListItemAllFields["FileDirRef"]);
Context.Load(folder);
Context.ExecuteQuery();
3)List.DefaultViewUrl
返回默认视图服务器相对网址,它与List
服务器相对网址
如何检索列表网址?
var file = Context.Web.GetFileById(documentGuid);
var item = file.ListItemAllFields;
Context.Load(item.ParentList, l => l.RootFolder);
Context.ExecuteQuery();
var listUrl = item.ParentList.RootFolder.ServerRelativeUrl;
4)由于SharePoint CSOM支持Request Batching,因此无需提交多个查询,而是只提交一个查询,如下所示:
SP.File file = Context.Web.GetFileById(documentGuid);
SP.ListItem item = file.ListItemAllFields;
var list = item.ParentList;
Context.Load(list, l => l.Title, l => l.RootFolder);
Context.Load(item);
Context.ExecuteQuery(); //<- submit a single batch query
public class SPDataAccess
{
public SPDataAccess(SP.ClientContext ctx)
{
Context = ctx;
}
public LibraryAndFolderInfo GetLibraryAndFolderInfo(Guid documentGuid)
{
var file = Context.Web.GetFileById(documentGuid);
var item = file.ListItemAllFields;
var list = item.ParentList;
Context.Load(list, l => l.Title, l => l.RootFolder);
Context.Load(item);
Context.ExecuteQuery();
var info = new LibraryAndFolderInfo();
var folderUrl = (string)item["FileDirRef"];
info.LibraryName = list.Title; //list title
info.LibraryBaseUrl = list.RootFolder.ServerRelativeUrl; //list url
if (folderUrl.Replace(list.RootFolder.ServerRelativeUrl, string.Empty).Length > 0)
{
info.FolderName = folderUrl.Split('/').Last(); //folder name
info.FolderUrl = folderUrl;
}
return info;
}
protected SP.ClientContext Context { get; private set; }
}