【发布时间】:2015-10-28 19:42:54
【问题描述】:
我想使用用户有权访问的 JSOM 显示网站集中的所有网站。换句话说,我只需要在网站集中找到用户可以访问的网站集合。我可以获取所有网站,但如果用户没有访问某些网站的权限,则它不起作用。
【问题讨论】:
标签: sharepoint-2010 sharepoint-clientobject
我想使用用户有权访问的 JSOM 显示网站集中的所有网站。换句话说,我只需要在网站集中找到用户可以访问的网站集合。我可以获取所有网站,但如果用户没有访问某些网站的权限,则它不起作用。
【问题讨论】:
标签: sharepoint-2010 sharepoint-clientobject
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());
});
【讨论】:
您好,下面的代码 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 开始。
【讨论】:
如果您可以改用 API,那么我建议您执行以下操作以返回当前用户的所有子网站。
using(SPSite site = new SPSite("http://example/site/"))
{
using (SPWeb web = site.OpenWeb())
{
SPWebCollection webCollection = web.GetSubwebsForCurrentUser();
}
}
注意:正如 Helm Sterk 在下面的评论中指出的那样,GetSubwebsForCurrentUser() 不会返回用户正在寻找的结果。所以上面的代码不起作用。
【讨论】: