0

$expand を使用して正常に動作する関連データを取得していますが、データが更新されたときにサーバーに送り返されるデータを変更する必要があります

サーバー側データ モデルに 2 つのエンティティが含まれている場合の例 Contact ID: number firstName: string middleName: string lastname: string ContactType: ContactType n-1

ContactType ID: 番号名: 文字列 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 を呼び出してグリッドにバインドするコードは次のとおりです。

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

では、データを再フォーマットするか、モデルまたはデータソース オプションを定義して、更新された "_ KEY:" を残して余分な ContactType フィールドを削除し、リクエスト全体を { " _ENTITIES":}でラップするにはどうすればよいですか?

助けてくれてありがとう!

ダン

4

2 に答える 2

0

parameterMap関数を使用して、必要な方法でデータをフォーマットすることができます。

于 2012-12-25T19:41:11.627 に答える
0

この投稿から答えを見つけたと思います

parameterMap の使用についてもう少し説明します。parameterMap の kendoui docs を見ると、これは pageIndex、size、orderBy ect などのパラメーターを管理するためだけのものであることが示されているようです。ただし、上記の投稿から、関連エンティティを削除する方法を示しています。または、エンティティまたは関連エンティティのフィールドを削除または変更するだけです。

例 関連エンティティ ContactType の ContactTypeID のみを削除できます

parameterMap: 関数 (オプション、操作) {

                            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});
                             }
                        }

まだやるべきことはあるが、これで何とかなると思う

助けてくれてありがとうペチカ

于 2012-12-25T20:57:56.753 に答える