我有一个简单的 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 字段设置为字符串吗?此外,任何想法我如何告诉用户控制器中的发布操作不要验证 id 字段(因为它应该处理创建一个新项目,所以服务器为新项目创建 ID 是有意义的,而不是客户端)。