【问题标题】:Get all sharepoint sites in a site collection to which user has access using Javascript client object model使用 Javascript 客户端对象模型获取用户有权访问的网站集中的所有共享点网站
【发布时间】:2015-10-28 19:42:54
【问题描述】:

我想使用用户有权访问的 JSOM 显示网站集中的所有网站。换句话说,我只需要在网站集中找到用户可以访问的网站集合。我可以获取所有网站,但如果用户没有访问某些网站的权限,则它不起作用。

【问题讨论】:

    标签: sharepoint-2010 sharepoint-clientobject


    【解决方案1】:

    SP.Web.getSubwebsForCurrentUser Method 返回一个经过安全调整(用户有权访问)的子站点集合(仅低于一级)

    示例

    var ctx = SP.ClientContext.get_current();
    var webs = ctx.get_web().getSubwebsForCurrentUser(null);
    ctx.load(webs);
    ctx.executeQueryAsync(
        function() {
            for(var i=0;i< webs.get_count();i++) {
                var web = webs.getItemAtIndex(i);
                console.log(web.get_title());   
            }
        },
        function(sender,args){
           console.log(args.get_message());
        }
    );
    

    如果您对网站集中的所有子网站感兴趣,您可以考虑以下方法。

    function getAllSubwebsForCurrentUser(success,error)
    {
       var ctx = SP.ClientContext.get_current();
       var web = ctx.get_site().get_rootWeb();
       var result = [];
       var level = 0;
       var getAllSubwebsForCurrentUserInner = function(web,result,success,error) 
       {
          level++;
          var ctx = web.get_context();
          var webs = web.getSubwebsForCurrentUser(null);
          ctx.load(webs,'Include(Title,Webs)');
          ctx.executeQueryAsync(
            function(){
                for(var i = 0; i < webs.get_count();i++){
                    var web = webs.getItemAtIndex(i);
                    result.push(web);
                    if(web.get_webs().get_count() > 0) {
                       getAllSubwebsForCurrentUserInner(web,result,success,error);
                    }   
                }
                level--;
                if (level == 0 && success)
                  success(result);  
            },
            error);
       };
    
       getAllSubwebsForCurrentUserInner(web,result,success,error);    
    }
    

    用法

    getAllSubwebsForCurrentUser(
    function(allwebs){
        for(var i = 0; i < allwebs.length;i++){
            console.log(allwebs[i].get_title());   
        }
    },
    function(sendera,args){
        console.log(args.get_message());
    });
    

    【讨论】:

    • 它不适用于具有“访问者”访问权限的用户,.. 当我从包含中删除 Web 时,它会转到 failure() 方法“错误”:ctx.load(webs,'Include (标题,网站)'); ,它正在工作并进入成功功能..有什么帮助吗??
    【解决方案2】:

    您好,下面的代码 sn-p 可能会对您有所帮助。

    var ctx = SP.ClientContext.get_current();
    var web = ctx.get_web();
    ctx.load(web);
    var webCollection = web.getSubwebsForCurrentUser(null);
    ctx.load(webCollection);
    ctx.executeQueryAsync(
      Function.createDelegate(this,this.onSuccess),
      Function.createDelegate(this,this.onError)
    );
    

    getSubwebsForCurrentUser - 使用 SP.SubwebQuery 类型的参数,您可以将其保留为空。 您使用此代码获得的网络集合只是一个级别。您将不会获得子网站的子网站。为此,您需要对您获得的每个 SP.Web 对象执行相同的语句 - 递归 - 从根 web 开始。

    【讨论】:

      【解决方案3】:

      如果您可以改用 API,那么我建议您执行以下操作以返回当前用户的所有子网站。

      using(SPSite site = new SPSite("http://example/site/"))
      {
      using (SPWeb web = site.OpenWeb())
      {
          SPWebCollection webCollection = web.GetSubwebsForCurrentUser();
      }
      }
      

      注意:正如 Helm Sterk 在下面的评论中指出的那样,GetSubwebsForCurrentUser() 不会返回用户正在寻找的结果。所以上面的代码不起作用。

      【讨论】:

      • getSubwebsForCurrentUser() 只返回当前站点下的一级站点。它不会增加子、子站点。
      猜你喜欢
      • 2013-08-04
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-28
      相关资源
      最近更新 更多