【问题标题】:SharePoint 2013 list item update with spaces in list nameSharePoint 2013 列表项更新,列表名称中包含空格
【发布时间】:2015-11-19 02:57:40
【问题描述】:

我正在尝试为其中的单个项目更新名称为“主管任务列表 (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' 的类型。当模型可用时,每种类型都必须解析为有效类型。

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

有什么想法吗?

【问题讨论】:

    标签: javascript ajax sharepoint-2013 splistitem


    【解决方案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);
    }
    

    【讨论】:

    • 谢谢瓦迪姆。这看起来很有可能最终成功。当我运行代码时,我遇到了一个问题,即它为 data.d.ListItemEntityTypeFullName 返回 null 或 undefined 。还有什么想法吗?谢谢。
    • Matthew,您能否尝试通过浏览器请求实体类型名称,而不是使用:http://[server]/_api/web/lists/GetByTitle('<list title>')?$select=ListItemEntityTypeFullName
    • 谢谢。我应该如何输入 ?我应该使用 http://[server url]/_api/web/lists/GetByTitle('Director's Task List (DTL)')?$select=ListItemEntityTypeFullName,还是 http://[server url]/_api/web/lists /GetByTitle('Director's%20Task%20List%20(DTL)')?$select=ListItemEntityTypeFullName ?
    【解决方案2】:

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

    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"]
            }
    };
    

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

    感谢您的帮助,瓦迪姆。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-04
      • 1970-01-01
      • 2012-12-25
      相关资源
      最近更新 更多