【问题标题】:How to find object type from URL SharePoint online (o365)?如何从 URL SharePoint online (o365) 中查找对象类型?
【发布时间】:2017-07-11 20:01:42
【问题描述】:

我发现了如何从预置 SharePoint 的 URL 中确定对象类型:
https://blogs.msdn.microsoft.com/sanjaynarang/2009/04/06/find-sharepoint-object-type-from-url/

但我没有找到任何适用于 SharePoint Online (CSOM) 的内容。

SharePoint 可以在线使用吗?

【问题讨论】:

    标签: sharepoint office365 csom


    【解决方案1】:

    对于大多数场景,例如:

    • 文件夹网址,例如https://contoso.sharepoint.com//Documents/Forms/AllItems.aspx?RootFolder=%2FDocuments%2FArchive
    • 列表项网址,例如https://contoso.sharepoint.com/Lists/ShoppingCart/DispForm.aspx?ID=9
    • 列表/库 url,例如https://contoso.sharepoint.com/Lists/Announcements
    • 页面网址,例如https://contoso.sharepoint.com/Lists/Announcements/Newsletter.aspx

    以下示例演示如何确定客户端对象类型:

    using System;
    using System.Linq;
    using System.Linq.Expressions;
    using System.Net;
    using System.Web;
    using Microsoft.SharePoint.Client;
    
    namespace O365Console
    {
        static class ClientObjectExtensions
        {
            public static ClientObject ResolveClientObjectFromUrl(string resourceUrl, ICredentials credentials)
            {
                ClientObject targetObject = null;
                var resourceUri = new Uri(resourceUrl);
                using (var rootCtx = new ClientContext(resourceUri.Scheme + Uri.SchemeDelimiter + resourceUri.Host))
                {
                    rootCtx.Credentials = credentials;
                    var webUrl = Web.WebUrlFromPageUrlDirect(rootCtx, resourceUri);
                    using (var ctx = new ClientContext(webUrl.ToString()))
                    {
                        ctx.Credentials = credentials;
    
                        var queryBag = System.Web.HttpUtility.ParseQueryString(resourceUri.Query);
                        if (queryBag["Id"] != null)
                        {
                            var listUrl = string.Join(string.Empty,
                                resourceUri.Segments.Take(resourceUri.Segments.Length - 1));
                            var list = ctx.Web.GetList(listUrl);
                            targetObject = TryRetrieve(() => list.GetItemById(Convert.ToInt32(queryBag["Id"])));
                        }
                        else if (queryBag["RootFolder"] != null)
                        {
                            var folderUrl = HttpUtility.UrlDecode(queryBag["RootFolder"]);
                            targetObject = TryRetrieve(() => ctx.Web.GetFolderByServerRelativeUrl(folderUrl));
                        }
                        else if (queryBag.Count > 0)
                        {
                            throw new Exception("Unsupported query string parameter found");
                        }
                        else
                        {
    
                            targetObject = TryRetrieve(() => ctx.Web.GetFileByServerRelativeUrl(resourceUri.AbsolutePath));
                            if (targetObject == null)
                            {
                                targetObject = TryRetrieve(() => ctx.Web.GetList(resourceUri.AbsolutePath),list => list.RootFolder);
                                if (targetObject == null || ((List)targetObject).RootFolder.ServerRelativeUrl != resourceUri.AbsolutePath)
                                    targetObject = TryRetrieve(() => ctx.Web.GetFolderByServerRelativeUrl(resourceUri.AbsolutePath));
                            }
                        }
                    }
                }
                return targetObject;
            }
    
    
            private static T TryRetrieve<T>(Func<T> loadMethod, params  Expression<Func<T,object>>[] retrievals) where T : ClientObject
            {
                try
                {
                    var targetObject = loadMethod();
                    targetObject.Context.Load(targetObject, retrievals);
                    targetObject.Context.ExecuteQuery();
                    return targetObject;
                }
                catch
                {
                }
                return default(T);
            }
        }
    }
    

    用法

     var credentials = GetCredentials(userName, password);
     var clientObj = ClientObjectExtensions.ResolveClientObjectFromUrl("https://contoso.sharepoint.com/Lists/Announcements", credentials);
     Console.WriteLine(clientObj.GetType().Name);
    

    在哪里

     static ICredentials GetCredentials(string userName,string password)
     {
            var securePassword = new SecureString();
            foreach (var c in password)
            {
                securePassword.AppendChar(c);
            }
            return new SharePointOnlineCredentials(userName, securePassword);
     } 
    

    【讨论】:

    • 非常感谢您的回答!您能否告诉 if (queryBag["RootFolder"] != null) 中的代码何时执行?我尝试了几个不同的网址,但从未达到此代码。不幸的是,这段代码给出了相同的答案 - 列表 - 用于文件夹、网络和列表。 .../Shared%20Documents/folder1, xxx.sharepoint.com/sites/Nested1/subsite1,../Lists/List1 但适用于列表项和文件。
    • @Natalie,关于https://mediadev19.sharepoint.com/Documents/Archive 之类的url,它确实未能正确检测到文件夹类型Archive,而是返回了Documents 列表类型。答案已更新以反映这种情况。
    猜你喜欢
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 2014-03-02
    相关资源
    最近更新 更多