如何使用 Javascript 检索用户属性

How to Retrieve User Properties with Javascript

您好,我在 Content Editor Web Part 中有以下代码,它检索当前用户的名称并将其显示在消息框中:

<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> 
<script language="javascript" type="text/javascript"> 

function getUser() {
    var userid = _spPageContextInfo.userId;
    //alert(userid);

    var requestUri = _spPageContextInfo.webAbsoluteUrl + "/_api/web/getuserbyid(" + userid + ")";
    var requestHeaders = { "accept": "application/json;odata=verbose" };
    $.ajax({
        url: requestUri,
        contentType: "application/json;odata=verbose",
        headers: requestHeaders,
        success: onSuccess,
        error: onError
    }); 

    function onSuccess(data, request) {
        var loginName = data.d.Title;
        alert(loginName);
    } 
    function onError(error) {
        alert("Error on retrieving current user.");
    }
}


    $(document).ready(function() {
        getUser();
    });
</script>

我还能够显示带有 alert(data.d.Email); 的电子邮件。

但是,当我尝试调用 data.d.Groups 时(根据 the documentation - 这表明 Groups 属性 存在),我看到一个消息框 [object Object]

如何从这个(我假设是一个)集合中检索单个项目?

我试过了:

var group = data.d.Groups[0];
alert(group);

但这只是undefined

我认为这个对象将包含我的部门是不是错了?

无论哪种方式,是否有一种遍历这些对象的方法,或者我是否正确地完成了但在一个空数组上?

谢谢


尝试记录群组

function onSuccess(data, request) {
    var loginName = data.d.Title;
    console.log(loginName);

    var groups = data.d.Groups;
    console.log(groups);
} 

我在 F12 控制台中看不到上述任何日志 window... (Internet Explorer)


尝试 2 - 记录成功

使用下面的代码,我能够获得与以前相同的结果,但是这次 console.log() 调用确实有效(仍然不知道为什么以前的没有):

ExecuteOrDelayUntilScriptLoaded(init,'sp.js');
var currentUser;
function init(){
    this.clientContext = new SP.ClientContext.get_current();
    this.oWeb = clientContext.get_web();
    currentUser = this.oWeb.get_currentUser();
    this.clientContext.load(currentUser);
    this.clientContext.executeQueryAsync(Function.createDelegate(this,this.onQuerySucceeded), Function.createDelegate(this,this.onQueryFailed));
}

function onQuerySucceeded() {

    var groups = currentUser.get_groups();
    alert(groups);
    console.log(groups);

    var name = currentUser.get_loginName(); 
    alert(name);
    console.log(name);

    var id = currentUser.get_id();
    alert(name);

    var title = currentUser.get_title();
    alert(title);

    var email = currentUser.get_email();
    alert(email);
}

function onQueryFailed(sender, args) {
    alert('Request failed. \nError: ' + args.get_message() + '\nStackTrace: ' + args.get_stackTrace());
}

调用console.log(groups);后,F12控制台出现以下内容:

"data.d.Groups" 是对象,当您将其传递给 .html(data.d.Groups) 时,您将获得它作为 [object Object] 只是因为对象将转换为字符串 Just循环对象,你会得到键和值

     for (key in data.d.Groups){
       alert("key: " + key + "value :" + data.d.Groups[key]);
     }

我找到了一个相当丑陋的解决方案,但它确实有效。

首先,我们需要在准备阶段调用一些.js文件:

<script src="//ajax.aspnetcdn.com/ajax/jQuery/jquery-1.9.0.min.js"></script>
<script src="/_layouts/15/SP.Runtime.js"></script>
<script src="/_layouts/15/SP.js"></script>
<script src="/_layouts/15/SP.UserProfiles.js"></script>

然后,在 <script language="javascript" type="text/javascript"> 标签内,我们声明了一些全局变量和 2 个主要函数...

var currentUser;
var currentUserName;
var property = "Department";    

1. GetCurrentUserProperty(属性):

这个函数实际上只为我们获取当前用户,如果成功将调用 loadUserData(实际上获取我们之前为给定用户定义的 property

// This function first gets the current user's firstname.lastname username (e.g. Joe.Bloggs).
// If this is successful, it calls the loadUserData function, which will retrieve the user's
// property which was defined in the global "property" variable.
function GetCurrentUserProperty(){
    this.clientContext = new SP.ClientContext.get_current();
    this.oWeb = clientContext.get_web();
    currentUser = this.oWeb.get_currentUser();
    this.clientContext.load(currentUser);
    this.clientContext.executeQueryAsync(onQueryUserSuccess, onQueryUserFail);
}
function onQueryUserSuccess() {
    // If the query is successful, extract the first.last username and then call loadUserData
    window.currentUserName= currentUser.get_loginName().split("\")[1]; 
    loadUserData(window.currentUserName);
}
function onQueryUserFail(sender, args) {
    alert('Failed to retrieve user name');
}

2。 loadUserData

此函数接受给定的 user.name 并将为该用户获取存储在 property 中的 属性。在这里,在 success 函数中,我只是将结果输出到 alert window:

function loadUserData(userName){        
    //Get Current Context   
    var clientContext = new SP.ClientContext.get_current();

    //Get Instance of People Manager Class
    var peopleManager = new SP.UserProfiles.PeopleManager(clientContext);

    //Property to fetch from the User Profile
    var strDepartment = window.property;

    //If you are on On-Premise:
    var targetUser = "BARDOM1\" + userName;

    //Create new instance of UserProfileProperty
    departmentProperty = peopleManager.getUserProfilePropertyFor(targetUser, strDepartment)

    //Execute the Query. (No load method necessary)
    clientContext.executeQueryAsync(onSuccess, onFail);
}
function onSuccess() {    
    var messageText = window.property + " is " + departmentProperty .get_value();
    alert(messageText);
}
function onFail(sender, args) {
    alert("Error: " + args.get_message());
}

最后,要真正运行这个过程,我们需要调用GetCurrentUserProperty();。我将所有这些代码放入一个名为 testproperty.js 的文件中,并将其保存在 SiteAssets 中。然后,在我们希望代码为 运行 的页面上,添加一个 Content Editor Web Part 并在编辑 -> 路径中调用 ../../SiteAssets/testproperty.js。这将在页面加载后 运行 - 希望这对其他可能卡在这个问题上的人有所帮助!