从文档ID获取库和文件夹

时间:2014-12-29 18:29:48

标签: c# sharepoint sharepoint-2013

给出的信息

我正在使用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行

这一行似乎试图在加载和失败时检索列表的标题。这是正确的假设吗?

我对如何加载属性并不是非常熟悉,因此失败行之后的所有内容都是我最好的猜测它是如何工作的。

这段代码应该是什么样的?还有其他人试图从文档中获取此信息吗?

1 个答案:

答案 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; }
}