1

我想创建一个 Windows 应用程序

展示 :

  • 所有网络应用程序,

  • 每个 Web 应用程序的站点集合,

  • 每个站点集合的站点,

  • 每个站点的子站点,

  • 所有列表-树视图中每个站点和子站点的库

在这里,我不想在应用程序启动时提供任何静态 URL,如果 SharePoint 安装在该计算机上,所有信息都会自动填充在树形视图中。

这可能吗 ?如果是,那怎么办?

4

2 回答 2

2

.Net 托管客户端对象模型:获取所有网站、库、项目

在 SharePoint 2010 中,我们有 3 个客户端对象模型。

  1. .Net 托管客户端对象模型
  2. 银光
  3. ECMA 脚本/JavaScript

今天,我将介绍 .NET 托管客户端对象模型,以从 SharePoint 检索所有网站、库和项目。

桌面应用程序的先决条件参考:

1. Microsoft.SharePoint.Client.dll
2. Microsoft.SharePoint.Client.Runtime.dll

我的自定义类感觉就像我们正在处理 SharePoint Server 对象模型:

public class SPWeb
 {
     public string WebGUID { get; set; }
     public string Title { get; set; }
     public string ServerRelativeUrl { get; set; }
     public string ParentType { get; set; }
     public SPBase Parent { get; set; }
 }
 public class SPList
 {
     public string ListGUID { get; set; }
     public string Title { get; set; }
     public string ParentWebUrl { get; set; }
     public string RootFolderServerRelativeUrl { get; set; }
 }

public class SPFolder
 {
     public string ID { get; set; }
     public string UniqueID { get; set; }
     public string Name { get; set; }
     public string Title { get; set; }
     public string ParentWebUrl { get; set; }
     public string ListName { get; set; }
     public string ServerRelativeUrl { get; set; }
     public string ParentFolderServerRelativeUrl { get; set; }
 }

 public class SPListItem
 {
     public string ID { get; set; }
     public string Name { get; set; }
     public string Title { get; set; }
     public string ServerRelativeUrl { get; set; }
     public string Modified { get; set; }
     public string ModifiedBy { get; set; }
     public string CreatedBy { get; set; }
     public string Size { get; set; }
     public string Created { get; set; }
     public string UniqueId { get; set; }
     public string ListName { get; set; }
 }

用于获取Webs/library/Items的方法:

public List<SPWeb> GetAllWebs(string webURL)
{
    var webColl = new List<SPWeb>();
    try
    {
    var currentWeb = _ctx.Site.OpenWeb(webURL);
    var allWebs = currentWeb.Webs;
    var webCollection = _ctx.LoadQuery(allWebs.Include(web => web.Title,
    web => web.Id, web => web.ServerRelativeUrl));
    _ctx.ExecuteQuery();
    webColl.AddRange(webCollection.Select(web => new SPWeb
                                {
                                  Title = web.Title,
                                  WebGUID = web.Id.ToString(),
                                  ServerRelativeUrl = web.ServerRelativeUrl
                                 }));
    }
    catch (Exception ex)
    {
      // error log
    }
 return webColl;
}

public List<SPList> GetAllLibraries(string webURL)
{
   var listColl = new List<SPList>();
   try
   {
     var currentWeb = _ctx.Site.OpenWeb(webURL);
     var query = from list in currentWeb.Lists
                 where list.BaseType == BaseType.DocumentLibrary
                 select list;
     var AllLists = currentWeb.Lists;
     var listCollection = _ctx.LoadQuery(query.Include(myList => myList.Title,
                                   myList => myList.Id,
                                   myList => myList.RootFolder.ServerRelativeUrl,
                                   myList => myList.ParentWebUrl,
                                   myList => myList.Hidden,
                                   myList => myList.IsApplicationList));
  _ctx.ExecuteQuery();

  listColl.AddRange(from list in listCollection
                    where !list.Hidden
                    select new SPList
                    {
                        Title = list.Title,
                        ListGUID = list.Id.ToString(),
                        RootFolderServerRelativeUrl = list.RootFolder.ServerRelativeUrl,
                        ParentWebUrl = list.ParentWebUrl
                     });
   }
   catch (Exception ex)
   {
       // error log
   }
  return listColl;
}

public List<SPFolder> GetAllFolder(string webURL, string listName, string folderName)
{
    var itemColl = new List<SPFolder>();
    try
    {
      var currentWeb = _ctx.Site.OpenWeb(webURL);
      var currentList = currentWeb.Lists.GetByTitle(listName);

      var query = new CamlQuery();

      if (folderName.Length > 0)
         query.FolderServerRelativeUrl = folderName;

      query.ViewXml = @"<View><Query><Where>
                        <Or>
                          <Eq>
                             <FieldRef Name='ContentType' />
                             <Value Type='Text'>Document Set</Value>
                          </Eq>
                          <Eq>
                             <FieldRef Name='ContentType' />
                             <Value Type='Text'>Folder</Value>
                          </Eq>
                        </Or>
                        </Where></Query></View>";

      var listitems = currentList.GetItems(query);
  _ctx.Load(listitems);
  _ctx.ExecuteQuery();

  itemColl.AddRange(listitems.ToList().Select(item => new SPFolder()
                   {
                       ID = Convert.ToString(item["ID"]),
                       UniqueID = Convert.ToString(item["GUID"]),
                       ListName = listName,
                       ParentWebUrl = webURL,
                       Title = Convert.ToString(item["FileLeafRef"]),
                       Name = "folder",
                       ServerRelativeUrl = Convert.ToString(item["FileRef"])
                   }).AsEnumerable());
  }
  catch (Exception ex)
  {
     // error log
  }
  return itemColl;
}
public List<SPListItem> GetAllItems(string webURL, string listName, string folderName)
{
    var itemColl = new List<SPListItem>();
    try
    {
        var currentWeb = _ctx.Site.OpenWeb(webURL);
        var currentList = currentWeb.Lists.GetByTitle(listName);
        var query = new CamlQuery();

        if (folderName.Length > 0)
           query.FolderServerRelativeUrl = folderName;

        var myquery = from myitems in currentList.GetItems(query)
                      select myitems;

        var listitems = _ctx.LoadQuery(myquery.Include(myitem => myitem["ID"],
                                      myitem => myitem["FileLeafRef"],
                                      myitem => myitem["Modified"],
                                      myitem => myitem["File_x0020_Size"],
                                      myitem => myitem["Modified_x0020_By"],
                                      myitem => myitem["Created_x0020_By"],
                                      myitem => myitem["FileRef"],
                                      myitem => myitem["UniqueId"],
                                      ));

         _ctx.ExecuteQuery();

         foreach (var nitem in listitems.Select(item => new SPListItem
         {
               ID = Convert.ToString(item["ID"]),
               ParentWebUrl = webURL,
               Title = Convert.ToString(item["FileLeafRef"]),
               Modified = item["Modified"] != null ?         Convert.ToString(item["Modified"]) : string.Empty, Size = item["File_x0020_Size"] != null ? Convert.ToString(item["File_x0020_Size"]) : string.Empty,
           CreatedBy = item["Created_x0020_By"] != null ? Convert.ToString(item["Created_x0020_By"]) : string.Empty,
           ModifiedBy = item["Modified_x0020_By"] != null ? Convert.ToString(item["Modified_x0020_By"]) : string.Empty,
           UniqueId = item["UniqueId"].ToString(),
           ServerRelativeUrl = Convert.ToString(item["FileRef"]),
           ListName = listName
     }))

     itemColl.Add(nitem);
}
catch (Exception ex)
{
     // error log
}
return itemColl;
}

为此,我使用了以下参考,

http://shahjinesh11.wordpress.com/2012/06/14/net-managed-client-object-model-fetch-all-webs-libraries-items/

它可以帮助你祝你好运:-)

于 2012-09-15T06:45:44.223 回答
0

我的代码:

protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                var service = SPFarm.Local.Services.GetValue<SPWebService>(string.Empty);
                foreach (SPWebApplication webApplication in service.WebApplications)
                {
                    ShowSiteCollection(webApplication.Sites);
                }
            }
        }

private void ShowSiteCollection(IEnumerable<SPSite> sites)
        {
            foreach (SPSite site in sites)
            {
                using (site)
                {
                    var rootWeb = site.RootWeb;
                    var node = new TreeNode(rootWeb.Title, rootWeb.Url);
                    if (rootWeb.Webs.Count > 0)
                    {
                        ShowWebCollection(rootWeb.Webs, (title, url) => node.ChildNodes.Add(new TreeNode(title, url)));
                    }

                    siteCollectionTree.Nodes.Add(node);
                }
            }
        }

 private static void ShowWebCollection(SPWebCollection collection, Action<string, string> func)
        {
            for (var i = 0; i < collection.Count; i++)
            {
                var info = collection.WebsInfo[i];

                func.Invoke(info.Title, info.ServerRelativeUrl);

                if (collection[i].Webs.Count > 0)
                {
                    ShowWebCollection(collection[i].Webs, func);
                }
            }
        }

以及获取列表的方法:

private static IEnumerable<List> GetSiteLists(string siteUrl)
        {
            using (var context = new ClientContext(siteUrl))
            {
                var query = from lists in context.Web.Lists
                            where !lists.Hidden
                            select lists;
                var siteLists = context.LoadQuery(query);
                context.ExecuteQuery();

                return siteLists;
            }
        }

我没有声称解决方案是最好的,但它确实有效。祝你好运!

于 2012-08-03T05:47:25.247 回答