1

我正在尝试为其中的单个项目更新名称为“主管任务列表 (DTL)”的 SharePoint 列表。我有以下代码:

var listName = 'Director''s Task List (DTL)';

var requestURI = _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getbytitle('" + listName + "')/items(" + ID + ")";

$.ajax({
    uri: requestURI,
    type: "POST",
    contentType: "application/json; odata=verbose",
    data: JSON.stringify(data),
    headers: {
        "Accept": "application/json; odata=verbose",
        "X-HTTP-Method": "MERGE",
        "IF-MATCH": "*",
        "X-RequestDigest": $("#__REQUESTDIGEST").val()
    }
});

其中数据是:

var data = {
    '__metadata': { 'type': getItemTypeForListName(listName)},
    'Suspense_x0020_Status' : 
        {
            '__metadata': { 'type': 'SP.FieldUrlValue' },
            'Description': statusObject[ID]["color"],
            'Url': statusObject[ID]["html"]
        }
};

getItemTypeForListName(listName) 是:

function getItemTypeForListName(listName) {
    var itemType = "SP.Data." + listName.charAt(0).toUpperCase() + listName.slice(1) + "ListName";
    var encItemType = itemType.replace(/\s/g,'_x0020_');
    return(encItemType);
}

我无法让代码正确完成。我收到一个错误:

模型无法解析名为 'SP.Data.Director''s_x0020_Task_x0020_List_x0020_(DTL)ListName' 的类型。当模型可用时,每种类型都必须解析为有效类型。

我知道它与空格和单撇号有关,但我尝试了几种解决方案,但没有运气。我已经看到双单撇号 "''" 是一种工作方法,它在让这个列表名称类型工作之前对我有所帮助。所以不要立即指出这一点。

有什么想法吗?

4

2 回答 2

1

瓦迪姆,谢谢你的帮助。我想我终于按照您的要求手动输入了它的工作请求。我不得不使用这个:

http://[server url]/_api/web/lists/GetByTitle('Director''s%20Task%20List%20(DTL)')listItemEntityTypeFullName

这返回了一个作为 SP.Data.TasksListItem 的值。然后我改变了我的数据输入如下:

var data = {
    '__metadata': { 'type': SP.Data.TasksListItem},
    'Suspense_x0020_Status' : 
        {
            '__metadata': { 'type': 'SP.FieldUrlValue' },
            'Description': statusObject[ID]["color"],
            'Url': statusObject[ID]["html"]
        }
};

然后,这似乎可以在列表中获取要更新的值。

谢谢你的帮助,瓦迪姆。

于 2015-11-18T18:57:40.737 回答
1

似乎getItemTypeForListName函数返回错误的列表项实体类型名称。

以下端点返回实际的列表项实体类型名称:/_api/web/lists/GetByTitle('<list title>')?$select=ListItemEntityTypeFullName

对于列表标题Director's Task List (DTL)::

  • getItemTypeForListName 函数返回 SP.Data.Director''s_x0020_Task_x0020_List_x0020_(DTL)ListName
  • 而指定的端点返回: SP.Data.Directors_x0020_Task_x0020_List_x0020_DTLListItem

例子

该示例显示如何返回列表项类型名称:

var listTitle = "Director''s Task List (DTL)"

function getItemTypeForListName(listTitle)
{
  return executeJson({
    url: _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getbytitle('" + listTitle + "')/?$select=ListItemEntityTypeFullName",
    method: 'GET'
  }).then(function(data){
       return data.d.ListItemEntityTypeFullName;
  });  
}

getItemTypeForListName(listTitle)
.done(function(name){
   console.log(name);
})
.fail(function(error){
  console.log(JSON.stringify(error));
});

在哪里

function executeJson(options) 
{
    var headers = options.headers || {};
    headers["Accept"] = "application/json;odata=verbose";
    if(options.method == "POST") {
        headers["X-RequestDigest"] = $("#__REQUESTDIGEST").val();
    }   

    var ajaxOptions = 
    {       
       url: options.url,   
       type: options.method,  
       contentType: "application/json;odata=verbose",
       headers: headers
    };
    if(options.method == "POST") {
      ajaxOptions.data = JSON.stringify(options.payload);
    }  

    return $.ajax(ajaxOptions);
}
于 2015-11-18T10:18:06.607 回答