0

シンプルな Sencha Touch 2.1 モデル クラスがあります。

Ext.define('App.model.User', {
    extend: 'Ext.data.Model',
    config: {
        fields: [
            { name: 'id', type: 'number', defaultValue: 0 },
            { name: 'first', type: 'string' },
            { name: 'last', type: 'string' },
            { name: 'email', type: 'string' },
            { name: 'lastUpdated', type: 'auto' }
        ]
    },
    fullName: function () {
        var d = this.data,
            names = [d.first, d.last];
        return names.join(" ");
    }
});

これらのモデルのコレクションは、sencha の Rest Proxy を使用するように設定したストアにあります。新しいモデルをストアに追加し、ストアでSyncメソッドを呼び出すと、新しいモデルが ASP.NET WebAPIユーザーコントローラーにポストされ、次のアクションが実行されます。

    // POST api/Default1
    public HttpResponseMessage PostUser(User user)
    {
        // this is a new user -- get rid of the ID
        user.Id = 0;
        if (ModelState.IsValid)
        {
            db.Users.Add(user);
            db.SaveChanges();

            HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, user);
            response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = user.Id }));
            return response;
        }
        else
        {
            return Request.CreateResponse(HttpStatusCode.BadRequest);
        }
    }

問題は、文字列がモデルの ID として送信されているため、コントローラーのModelState.IsValidチェックに合格していないことです。これは実際に送信されているものです:

{"id":"ext-record-5","first":"c","last":"d","email":"e","lastUpdated":null}

id フィールドが文字列に設定されている理由がわかりましたか? また、 Usersコントローラーのpostアクションにidフィールドを検証しないように指示する方法を考えてください(新しいアイテムの作成を処理する必要があるため、クライアントではなくサーバーが新しいアイテムのIDを作成することは理にかなっています)。

4

2 に答える 2

1

このリンクは、私がそれを理解するのに役立ちました。更新されたモデルは次のようになります。

Ext.define('App.model.User', {
    extend: 'Ext.data.Model',
    config: {
        fields: [
            { name: 'id', type: 'auto', persist: false },
            { name: 'first', type: 'string' },
            { name: 'last', type: 'string' },
            { name: 'email', type: 'string' },
            { name: 'lastUpdated', type: 'auto' }
        ],
    },
    fullName: function () {
        var d = this.data,
            names = [d.first, d.last];
        return names.join(" ");
    }
});
于 2012-12-08T00:38:35.963 に答える
0

モデルに idProperty を設定する必要があります。id のフィールドもタイプ auto に設定する必要があります。こちらのドキュメントを参照してください

于 2012-12-07T17:33:21.213 に答える