SharePoint 2010 REST API, публикация содержимого в списке, содержащем столбец «ПОЛЬЗОВАТЕЛИ»

#javascript #rest #sharepoint #sharepoint-2010

#javascript #rest #sharepoint #sharepoint-2010

Вопрос:

Например, у меня есть вызов списка «список покупок», в нем 2 столбца. 1-й тип столбца — люди или группы (допускается несколько человек), имя столбца — «Клиенты». 2-й тип столбца — string.

Я могу использовать ajax для публикации информации в обычном списке SharePoint, но только не в этом списке покупок. Я знаю, как форматировать данные для однопользовательского столбца, но не для столбца с несколькими пользователями, однопользовательский столбец выглядит примерно так: имя столбца — Customer, формат данных должен быть:

 item.CustomerID=1; 

Я перепробовал множество способов форматирования данных, но они все те же. Сервер возвращает 500 без какой-либо полезной информации.
Примеры форматов ниже:

 item.Customers = [1,2,3]   //1,2,3 is the user id in SharePoint.
item.CustomersID=[1,2,3]  //1,2,3 is the user id in SharePoint.
item.Customers=[{UserId:1},{UserId:2},{UserId:3}] 

Я могу подтвердить, что объект javascript был stringify и запрос post правильно отправлен, поскольку я успешно добавил новые элементы в тот же список без заполнения столбца Customers.

Может кто-нибудь, пожалуйста, посоветуйте мне, какой правильный формат для публикации содержимого в SharePoint 2010 REST API с несколькими пользовательскими столбцами.

Ответ №1:

В случае интерфейса SharePoint 2010 REST правильная полезная нагрузка для многозначного пользовательского поля должна выглядеть следующим образом:

 '<MultiUserFieldName>': [
    { 
        __metadata: { 
            "uri": "<WebUrl>/_vti_bin/listdata.svc/UserInformationList(<UserId>)"
        }
    }
]
 

где

  • MultiUserFieldName — имя поля пользователя
  • WebUrl — абсолютный веб-URL
  • UserId — идентификатор пользователя

Пример JavaScript

 var webUrl = "http://contoso.intranet.com";
var listName = "ShoppingCart";
var properties = {
    'Title': 'Item #123',
    'Customers': createPayloadForMultiUserField(webUrl,[1,2,3])
};


createListItem(webUrl,listName,properties)
.done(function(data){
    console.log('Item '   data.d.Title   ' has been created'); 
})
.fail(function(error){
    console.log(JSON.stringify(error));
});
 

где

 function createListItem(webUrl,listName, itemProperties) {
    return $.ajax({
        url: webUrl   "/_vti_bin/listdata.svc/"   listName,
        type: "POST",
        processData: false,
        contentType: "application/json;odata=verbose",
        data: JSON.stringify(itemProperties),
        headers: {
            "Accept": "application/json;odata=verbose"
        }
    });
}


function createPayloadForMultiUserField(webUrl,userIds)
{
    return userIds.map(function(id){
        return { 
            __metadata: { 
                "uri": webUrl   "/_vti_bin/listdata.svc/UserInformationList("   id   ")"
            }
        } 
    });
}
 

Комментарии:

1. Отлично работает, большое спасибо за это. На самом деле я целый день искал этот ответ в Google.