如何从URL SharePoint在线查找对象类型(o365)?

时间:2017-07-04 07:31:37

标签: sharepoint office365 csom

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

但我没有为SharePoint Online(CSOM)找到任何东西。

SharePoint可以在线吗?

1 个答案:

答案 0 :(得分:1)

对于大多数情况,例如:

  • 文件夹网址,例如https://contoso.sharepoint.com//Documents/Forms/AllItems.aspx?RootFolder=%2FDocuments%2FArchive
  • 列表项目网址,例如https://contoso.sharepoint.com/Lists/ShoppingCart/DispForm.aspx?ID=9
  • list / library 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);
 }