配置Sencha的Rest Proxy不要在POST上发送模型的ID

时间:2012-12-07 16:40:52

标签: asp.net-web-api sencha-touch-2

我有一个简单的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);
        }
    }

问题是a字符串是作为模型的ID发送的,所以它没有在控制器上传递 ModelState.IsValid 检查。这就是实际发送的内容:

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

知道为什么id字段被设置为字符串?另外,任何想法如何告诉用户控制器中的发布操作不要验证id字段(因为它应该处理创建新项目,它是有意义的服务器为新项目而不是客户端创建ID。

2 个答案:

答案 0 :(得分:1)

link让我明白了。更新的模型应该是:

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

答案 1 :(得分:0)

您需要在模型上设置idProperty。 id的字段也应设置为auto类型。请参阅文档here.