1

我正在使用Data Source对象使用 REST 连接到 SharePoint 2013 ODATA 源,然后将其用作Kendo UI Grid的数据。

数据源正确读取列表并填充网格,但是当我更新Kendo UI 网格中的项目时,REST 端点返回以下错误。

类型“SP.SecurableObject”上不存在属性“__deferred”。确保仅使用类型定义的属性名称。

这是由于数据源从初始读取请求返回所有属性,然后在更新命令中返回。

SharePoint 返回带有 REST URL 的 __deferred 属性以延迟加载,但如果它们在更新命令请求中返回,则会引发不稳定。

下面是我的数据源

var dataSource = new kendo.data.DataSource({
        type: "odata",
        transport: {
            read: {
                url: listUrl,
                type: "GET",
                dataType: "json",
                contentType: "application/json;odata=verbose",
                headers: {
                    "accept": "application/json;odata=verbose"
                }
            },
            create: {
                url: listUrl,
                type: "POST",
                dataType: "json",
                contentType: "application/json;odata=verbose",
                headers: {
                    "accept": "application/json;odata=verbose",
                    "X-RequestDigest": $("#__REQUESTDIGEST").val(),
                }
            },
            update: {
                url: function (data) {
                    return listUrl + "(" + data.ID + ")";
                },
                beforeSend: function (jqXhr, options) {

                    var data = JSON.parse(options.data);

                    jqXhr.setRequestHeader("If-Match", data.__metadata.etag);

                },
                type: "POST",
                dataType: "json",
                contentType: "application/json;odata=verbose",
                headers: {
                    "accept": "application/json;odata=verbose",
                    "X-RequestDigest": $("#__REQUESTDIGEST").val(),
                    "X-HTTP-Method": "MERGE"
                },
            },
            destroy: {
                url: function (data) {
                    return listUrl + "(" + data.ID + ")";
                },
                type: "DELETE",
                dataType: "json",
                contentType: "application/json;odata=verbose",
                headers: {
                    "accept": "application/json;odata=verbose",
                    "X-RequestDigest": $("#__REQUESTDIGEST").val(),
                    "X-HTTP-Method": "MERGE",
                    "If-Match": "*"
                }
            }
        },
        pageSize: 20,
        schema: {
            data: "d.results",
            model: {
                id: "ID",
                fields: {
                    ID: { editable: false, nullable: false },
                    Title: { validation: { required: true } },
                    Body1: { validation: { required: true } },
                    Votes: { type: "number", validation: { required: true, min: 1 } },
                }
            }
        }
    });
4

2 回答 2

2

您可以在 DataSource.transport 上指定“parameterMap”函数,并过滤掉您不需要的数据。


var dataSource = new kendo.data.DataSource({
  type: "odata",
  transport: {

    parameterMap: function(data, type){
      if (type === "update" && data["__deferred"]){
        delete data["__deferred"];
      }
      return kendo.stringify(data);
    }

    // ...
  },

  // ...
});   

请参阅http://docs.kendoui.c​​om/api/framework/datasource#configuration-transport.parameterMap

如果您正在使用可观察对象,另一种选择是.toJSON在您的对象上提供自定义方法。我写了一篇关于这个的博客文章,在这里:http ://www.kendoui.c​​om/blogs/teamblog/posts/13-04-04/hijacking-tojson-for-fun-and-profit.aspx

于 2013-05-08T11:54:16.647 回答
1

使用 Derick Bailey 的回答,我可以使用 parameterMap 执行以下操作

问题对象是定义的数据模型。使用此方法,它只会发送模型中定义的字段以及 SharePoint 所需的 __metadata 字段。

parameterMap: function (data, type) {

                if (type == "update") {
                    for (var property in data) {
                        if (property != "__metadata" && !question.fields[property])
                            delete data[property];
                    }
                }

                return kendo.stringify(data);
            }
于 2013-05-08T17:41:01.993 回答