【问题标题】:Add ListItem to List Folder using Rest-Api使用 Rest-Api 将 ListItem 添加到列表文件夹
【发布时间】:2016-12-23 16:40:58
【问题描述】:

我在使用 SharePoint 2013 REST api 时在指定文件夹中添加 ListItem 时遇到问题。

使用客户端对象模型看起来像这样:

    var creationInfo = new SP.ListItemCreationInformation();
    creationInfo.FolderUrl = "/Lists/MyList/MyFolder";
    var item = list.addItem(creationInfo );



    item.update();

    ctx.executeQueryAsync(
            Function.createDelegate(this, onSuccess),
            Function.createDelegate(this, onFail));

但是当我尝试通过 Rest Service 设置 FolderUrl 时

{ '__metadata' : { 'type': 'SP.Data.MyListListItem' }, 'Title': 'NewItemInFolder', 'FolderUrl': '/sites/example/Lists/MyList/MyFolder' }

我收到了 400 错误请求

我也尝试过先将 ListItem 添加到 List,然后更新 FolderUrl,但这也没有用。

如何使用 Rest-Api 将 ListItem 添加到 SharePoint 中的列表文件夹?

编辑:

 { '__metadata' : { 
            'type': 'SP.Data.MyListListItem',
            'type': 'SP.Data.ListItemCreationInformation'
    }, 
    'Title': 'NewItemInFolder',
    'FolderUrl': '/sites/example/Lists/MyList/MyFolder'
    }

我现在尝试同时使用 ListItemEntityTypeFullName 列表中的实体和 ListItemCreationInformation 但我也只收到 400 错误请求。

当我使用 Fiddler 查看请求时,我发现 SharePoint 现在正在忽略我的列表实体类型 SP.Data.MyListItem

【问题讨论】:

  • 为什么你的'type'属性的值为'SP.Data.MyListListItem'?不应该是“SP.ListItemCreationInformation”吗?
  • 如 Msdn link 中所述,它必须是 ListItemEntityTypeFullName,这就是为什么它是 MyListListItem。我将尝试使用 ListItemCreationInformation
  • 我已经试过了,请看我的编辑,我没有效果。

标签: javascript rest sharepoint-2013


【解决方案1】:

您不应使用 REST api,而应使用 listdata.svc

url: /_vti_bin/listdata.svc/[Name of List]
Header:Content-Type: application/json;odata=verbose
Body: {Title: "Title", Path: "/ServerRelativeUrl"}

我遇到了同样的问题,但是使用 REST api 它不能使用旧的 svc。

【讨论】:

  • 为什么“不应该”使用 REST api 的原因是什么?
【解决方案2】:

您可以考虑以下解决方案,它包含以下 3 个步骤:

  • 创建ListItem 资源
  • 获取关联 File 资源并最终将其移动到文件夹中

示例

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

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

    return $.ajax(ajaxOptions);
}



function createListItem(webUrl,listTitle,properties,folderUrl){
    var url = webUrl + "/_api/web/lists/getbytitle('" + listTitle + "')/items";
    return executeJson({
        "url" :url,
        "method": 'POST',
        "payload": properties})
        .then(function(result){
             var url = result.d.__metadata.uri + "?$select=FileDirRef,FileRef";
             return executeJson({url : url});
        })
        .then(function(result){
             var fileUrl = result.d.FileRef;
             var fileDirRef = result.d.FileDirRef;
             var moveFileUrl = fileUrl.replace(fileDirRef,folderUrl);
             var url = webUrl + "/_api/web/getfilebyserverrelativeurl('" + fileUrl + "')/moveto(newurl='" + moveFileUrl + "',flags=1)";
             console.log(url);
             return executeJson({
                  "url" :url,
                  "method": 'POST',
                  });
        });
}

用法

var webUrl = _spPageContextInfo.webAbsoluteUrl;
var listTitle = "Requests";  //list title
var targetFolderUrl = "/Lists/Requests/Archive";  //folder server relative url
var itemProperties = {
    '__metadata': { "type": "SP.Data.RequestsListItem" },
    "Title": 'Request 123'
};


createListItem(webUrl,listTitle,itemProperties,targetFolderUrl)
.done(function(item)
{
    console.log('List item has been created');
})
.fail(function(error){
    console.log(JSON.stringify(error));
});

Gist

【讨论】:

    【解决方案3】:
    Microsoft.SharePoint.Client.ClientContext clientContext = new Microsoft.SharePoint.Client.ClientContext("URL");
    
    Microsoft.SharePoint.Client.List list = clientContext.Web.Lists.GetByTitle("FolderName");
    
    var folder = list.RootFolder;
    
    clientContext.Load(folder);
    
    clientContext.Credentials = new NetworkCredential(username, password, domain);
    clientContext.ExecuteQuery();
    
    folder = folder.Folders.Add("ItemName");
    
    clientContext.Credentials = new NetworkCredential(username, password, domain);
    clientContext.ExecuteQuery();
    

    【讨论】:

    • 那是通过客户端对象模型而不是我询问的 Restful Api
    【解决方案4】:
    creationInfo.set_folderUrl("http://siteURL/Lists/Docs/Folder1");
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-25
    • 2015-12-20
    • 2011-04-19
    • 2020-11-25
    • 2023-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多