【问题标题】:Can't create a LookUpField无法创建 LookUpField
【发布时间】:2019-02-17 03:22:23
【问题描述】:

我正在创建一个新列表并尝试在列表中添加一个查找字段。

我检索要查找的列表:

let list = sp.web.lists.getByTitle("Trucks");
    list.get().then(list => {
        this._ensureMyList("MySPListTest", list)
    }); 

然后我创建新列表和新字段:

private _ensureMyList(listName: string, truckList): void {
    sp.web.lists.ensure(listName)
        .then((ler: ListEnsureResult) => {
            if (ler.created) {
                console.log("list was created");

                ler.list.fields.add("LookupTest", "SP.FieldLookup", { 
                    Group: "~Example",
                    FieldTypeKind: 7,
                    Filterable: true,
                    Hidden: false,
                    EnforceUniqueValues: true,
                })
                    .then((result) => {
                        console.log("result: ", result);
                    });
            }
        });
}

我得到错误:

Uncaught (in promise) Error: Error making HttpClient request in queryable: [500]  ::> {"responseBody":{"odata.error":{"code":"-2146232832, Microsoft.SharePoint.SPException","message":{"lang":"en-US","value":"Please use addfield to add a lookup field instead."}}},"responseHeaders":{}}

我从以下位置获得字段名称和类型类型:

https://msdn.microsoft.com/en-us/library/office/dn600182.aspx#bk_FieldLookup

我也尝试过使用addLookup 方法:

ler.list.fields.addLookup("LookupTest", truckList.Id, "Truck")
    .then((result) => {
        console.log("result: ", result);
    });

有错误:

Uncaught (in promise) Error: Error making HttpClient request in queryable: [400]  ::> {"responseBody":{"odata.error":{"code":"-1, Microsoft.SharePoint.Client.InvalidClientQueryException","message":{"lang":"en-US","value":"The parameter __metadata does not exist in method AddField."}}},"responseHeaders":{}}

【问题讨论】:

    标签: javascript typescript sharepoint spfx sharepointframework


    【解决方案1】:

    您可以考虑以下选项来添加查找字段:

    1) 通过Fields.addLookup method

    let list = await sp.web.lists.getByTitle(listTitle);  //get list resource
    let lookupList = await sp.web.lists.getByTitle(lookupListTitle).select("Id").get();  //select Lookup List Id 
    let field = await list.fields.addLookup(lookupFieldName, lookupList.Id ,"Title"); // add lookup field to list
    

    2) 通过Fields.createFieldAsXml 方法:

    let list = await sp.web.lists.getByTitle(listTitle); //get target list resource
    let lookupList = await sp.web.lists.getByTitle("Categories").select("Id").get(); //determine lookup list id
    let fieldXml = `<Field Name="Category" Type="Lookup" DisplayName="Category" List="{${lookupList.Id}}" ShowField="Title"/>`;  //construct lookup field schema
    let field = await list.fields.createFieldAsXml(fieldXml);  //add field to list
    

    参考文献

    PnPjs Add Fields

    更新

    关于调用Fields.addLookup方法时出现的错误:

    方法AddField中不存在参数__metadata。

    Fields.addLookup method 的最新版本 (v1.2.1) 中似乎存在错误。关键是它会生成 invalid 有效载荷,如下所示:

    {
       "__metadata":{
         "type":"SP.FieldCreationInformation"
       },
       "parameters": { 
              "FieldTypeKind":7,
              "LookupFieldName":"Title",
              "LookupListId":"{list-id}",
              "Title":"Cat"
       }
    } 
    

    parameters 应该是 http://&lt;site url&gt;/_api/web/lists(guid'&lt;list id&gt;')/fields('&lt;field id&gt;')/addfield 端点 (source) 负载中的 root 标记

    According to the history 这个错误是在后来的一次提交中引入的,无论如何最好报告一个问题。

    【讨论】:

    • 选项 1 在我的帖子中给了我同样的错误。选项 2 很棒并且正在工作,谢谢!知道为什么我不断收到这些错误吗?
    • @Holden1515,确实发生了,答案已更新
    • 啊!感谢您挖掘并提交报告!
    猜你喜欢
    • 2021-01-11
    • 2022-12-11
    • 2015-09-16
    • 2021-04-18
    • 2014-11-21
    • 2018-05-12
    • 2011-07-09
    • 2020-10-01
    • 2017-01-12
    相关资源
    最近更新 更多