使用kendo.datasource更改发送到服务器的数据以获取有关更新的相关数据?

时间:2012-12-25 19:35:53

标签: kendo-ui

我正在使用$ expand获取相关数据,但工作正常,但我需要更改发回的数据 数据更新时到服务器

示例,如果我的服务器端数据模型包含两个实体 联系    身份证号码    firstName:string    middleName:string    姓氏:字符串    ContactType:ContactType n-1

ContactType    ID:nubmer    name:string     ContactCollection:ContactType 1-n

这是我的数据源代码

function GetContactDS(){
        var MyModel = kendo.data.Model.define({
                                id: "ID",
                                fields: {
                                __KEY: { type: "string" },
                                __STAMP: { type: "number" },
                                ID: { editable: false, nullable: true },                                                               
                                firstName: { type: "string" },
                                middleName: { type: "string" },                                                        
                                lastName: { type: "string" }                               
                                },                             
                            });

            var crudServiceBaseUrl = "http://127.0.0.1:8081/cors/Contact";
            var  MyDataSource = new kendo.data.DataSource({
        transport: {
       read: function(options) {
               $.ajax( {
                url: crudServiceBaseUrl + '/?$expand=ContactType',
                dataType: "json",
                data: options.data,
                success: function(result) {
                    options.success(result);
                }
            });
        },

    update: function(options) {
            $.ajax( {
                url: crudServiceBaseUrl + "/?$method=update",
                type: "POST",
                dataType: "json",
                data: kendo.stringify(options.data.models),
                success: function(result) {
                    // notify the DataSource that the operation is complete

                    options.success(result);
                }
            });
        },
                                destroy: {
                                url: crudServiceBaseUrl + "/?$method=delete",
                                type: "GET"
                                },
                                create: {
                                url: crudServiceBaseUrl + "/?$method=update",
                                dataType: "json",
                                type: "POST"
                                },
                                          parameterMap: function(options, operation) {
                                    if (operation !== "read" && options.models) {
                                       return  JSON.stringify({"__ENTITIES": options.models});
                                    }
                                }
                                },
                                batch: true,
                                pageSize: 30,
                                schema: {
                                     model: MyModel,
                                    data: "__ENTITIES"                         
                                    }

            });

      return MyDataSource;
}

读取请求返回此数据

{"__entityModel":"Contact","__COUNT":1,"__SENT":1,"__FIRST":0,"__ENTITIES":[{"__KEY":"7","__STAMP":9,"ID":7,"firstName":"jay","middleName":"a","lastName":"blue","ContactType":{"__KEY":"2","__STAMP":4,"ID":2,"name":"Home","contactCollection":{"__deferred":{"uri":"/rest/ContactType(2)/contactCollection?$expand=contactCollection"}}}}]}

这是调用read和绑定到grid

的代码
var ContactDS = GetContactDS();

    $("#grid").kendoGrid({
        selectable: "row",
        filterable: true,
        pageable: true,
        sortable: true,
        change: function(){

                 datamodel = this.dataItem(this.select());
                 ID = datamodel.ID

        },
        dataSource: ContactDS,
        columns: [
            { field: "ID" },
            { field: "firstName" },
            { field: "middleName" },
            { field: "lastName" },
            {field: "ContactType.name"}

        ]
    });

哪个工作正常我在我的数据源中获取ContactType的扩展信息,并且它可以很好地绑定到网格。 现在我想更新之后将所选数据行读入表单,将数据读入表单工作正常。

问题是将更新发送回服务器,该服务器期望相关实体ContactType的格式略有不同 它只需要更改“__Key”的更改值 这是我的更新功能:

$("#update").click(function () {
                  datamodel.set("firstName", $("#firstName").val());
                  datamodel.set("lastName", $("#lastName").val());
                  datamodel.set("middleName", $("#middleName").val());
               //   datamodel.set("ContactType.__KEY",3);



                  ContactDS.sync();

这是服务器期望的数据

{ "__ENTITIES": [{"__KEY":"7","__STAMP":14,"firstName":"jay","middleName":"a","lastName":"red","ContactType":{"__KEY":"2"}}]}

这是kendo.datasource发送的内容

[{"__KEY":"7","__STAMP":12,"ID":7,"firstName":"jay","middleName":"a","lastName":"blue","ContactType":{"__KEY":"3","__STAMP":2,"ID":3,"name":"Work","contactCollection":{"__deferred":{"uri":"/rest/ContactType(3)/contactCollection?$expand=contactCollection"}}}}]

那么我如何重新格式化数据或定义我的模型或数据源选项以确保删除额外的ContactType字段,只留下更新的“_ KEY:”以及将整个请求包装在{“ _ENTITIES“:}

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

您可以尝试使用 parameterMap 功能以您需要的方式格式化数据。

答案 1 :(得分:0)

我想我找到了这个post

的答案

它解释了使用parameterMap的更多内容。如果你看一下parameterMap上的kendoui文档,它似乎表明这只是用于管理像 pageIndex,size,order等等。但是从上面的帖子中它会告诉你如何删除相关实体,或者你可以删除或修改实体或相关实体的字段

示例我只能删除相关实体ContactType的ContactTypeID

parameterMap:function(options,operation){

                            if (operation == "create") {

                            return  JSON.stringify({"__ENTITIES": options.models});
                            }
                            else if (operation == "update") {
                                debugger;
                            delete options.models[0].ContactType.ID;
                            return  JSON.stringify({"__ENTITIES": options.models});
                             }
                        }

还有一些工作要做,但我认为这会让我到那里

感谢Pechka的帮助