如何使用REST API在SP2013中将用户添加到SharePoint列表项用户字段?

9
我有一个基本的SharePoint列表,其中包含人员字段。现在我正在尝试使用Rest API添加新的列表项,并尝试将人员字段设置为我的别名,但它没有起作用,并且抛出了以下错误。看起来问题在于我的用户数据被传递的方式,但我在网上找不到任何帮助。
你们能帮忙找出正确的调用方式吗?非常感谢任何帮助。
我的代码:
function runAjax(){   var d  = JSON.stringify({"__metadata":{"type":"SP.Data.RepositoryItem"},"Owners":"-1;#v-mynme@microsoft.com"});
jQuery.ajax({ 
    url: "https://microsoft.sharepoint.com/sites/mysite/docstore/_api/web/lists/GetByTitle('Repository')/items(1580) ",
    type: "POST", 
    headers: { 
        "accept": "application/json;odata=verbose", 
        "content-type": "application/json;odata=verbose", 
        "X-RequestDigest": $("#__REQUESTDIGEST").val(), 
        "X-HTTP-Method": "MERGE", 
        "If-Match": "*" 
    }, 
    data:d, 
    success: function (_a) { 
        console.log(JSON.stringify(_a)); 
    }, 
    error: function (_e) { 
        console.error(JSON.stringify(_e)); 
    } 
});}runAjax(); 

我遇到的错误是

Updation fail
{"readyState":4,"responseText":"{\"error\":{\"code\":\"-1, Microsoft.SharePoint.Client.InvalidClientQueryException\",\"message\":{\"lang\":\"en-US\",\"value\":\"A 'PrimitiveValue' node with non-null value was found when trying to read the value of a navigation property; however, a 'StartArray' node, a 'StartObject' node, or a 'PrimitiveValue' node with null value was expected.\"}}}","status":400,"statusText":"Bad Request"} 

http://www.codeproject.com/Articles/990131/CRUD-operation-to-list-using-SharePoint-Rest-API - Atish Kumar Dipongkor
5个回答

13

如何使用SharePoint REST API设置用户字段值

假设以下函数用于使用SharePoint REST创建列表项:

function createListItem(webUrl,listName,itemProperties) 
{    
    return $.ajax({       
       url: webUrl + "/_api/web/lists/getbytitle('" + listName + "')/items",   
       type: "POST",   
       processData: false,  
       contentType: "application/json;odata=verbose",
       data: JSON.stringify(itemProperties),
       headers: {   
          "Accept": "application/json;odata=verbose",
          "X-RequestDigest": $("#__REQUESTDIGEST").val()
       }  
    });
}

用户字段值的格式:

  • 单值用户字段:'<user field name>' : <user id>
  • 多值用户字段:'<user field name>' : { 'results': [<array of user ids>] }

多个用户字段值

示例演示了如何创建任务项并指定具有多个值的AssignedTo字段:

//Create a Task item
var taskProperties = {
    '__metadata' : { 'type': 'SP.Data.TasksListItem' },
    'Title': 'Order approval',
    'AssignedToId' : { 'results': [10] }
};
createListItem(_spPageContextInfo.webAbsoluteUrl,'Tasks',taskProperties)
.done(function(data)
{
   console.log('Task has been created successfully');
})
.fail(
function(error){
    console.log(JSON.stringify(error));
});

单个用户字段值

示例演示如何创建任务项并指定一个单值AssignedTo字段:

//Create a Task item
var taskProperties = {
    '__metadata' : { 'type': 'SP.Data.TasksListItem' },
    'Title': 'Order approval',
    'AssignedToId' : 10
};
createListItem(_spPageContextInfo.webAbsoluteUrl,'Tasks',taskProperties)
.done(function(data)
{
   console.log('Task has been created successfully');
})
.fail(
function(error){
    console.log(JSON.stringify(error));
});

2
你的答案没问题,但是作为开发者,重要的是要提到在字段名末尾添加“Id”。例如,“Owners”字段应该变成“OwnersId”,而在你的例子中,“AssignedTo”变成了“AssignedToId”。从一开始并不明显,相信我 :) - Ruslan Korkin
如果我想清除该字段,应该使用什么值? - Mahesh kumar Chiliveri

2
你收到的错误信息可能很令人困惑。在这种情况下,尽管“Owners”是“Person/Group”字段的名称(SharePoint列表字段的显示名称或内部名称),但使用REST API更新此字段时,它可能是其他内容。
{"__metadata":{"type":"SP.Data.RepositoryItem"},"Owners":"-1;#vmynme@microsoft.com"}

要查找精确的字段定义,请使用GET方法尝试以下URL,并调查返回的XML值。

https://microsoft.sharepoint.com/sites/mysite/docstore/_api/web/lists/GetByTitle('Repository')/items(1580)

XML可能看起来像以下内容:
<m:properties> 
...
<d:DateModified m:type="Edm.DateTime">2014-01-07T00:00:00Z</d:DateModified><d:OwnersById m:null="true" />
...
</m:properties>

很可能您会注意到,“所有者”字段被命名为其他名称,例如“OwnersId”。您需要重构ajax post数据以使用确切的字段名称,并指定用户的Id属性而不是用户的LoginName属性作为发布的值。


2
正确的方法应该如下所示:(我相信这将为某些人节省时间)
 var requestApprover = {
                        '__metadata' : { 'type': 'Collection(Edm.Int32)' },
                        'results': [10,20,30]
                    };

记住,字段名应该以Id结尾,类型应该是您正在更新的字段类型,其中对于人员或组(多个)为Collection(Edm.Int32)。


0

您需要使用以下语法执行POST调用以获取用户字段:

如果字段名称为“Owners”,则需要在REST调用正文中发送"OwnersId": 1(将ID附加到列名并传递UserID的值)。

如果您需要检查用户列的确切名称,请在浏览器中启动F12 Dev工具,启动网络捕获,然后在浏览器中输入您的URL。

"https://microsoft.sharepoint.com/sites/mysite/docstore/_api/web/lists/GetByTitle('Repository')/items(1580) "

在响应体中,您将看到所有列的确切名称(如在REST中使用的名称)。

0

您尝试过使用用户名的声明编码吗?这是我更新此类字段的方法。 例如: "i:0#.w|contoso\chris"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接