Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net web api 配置Sencha';s Rest代理不发送模型';他在一个柱子上的身份证_Asp.net Web Api_Sencha Touch 2 - Fatal编程技术网

Asp.net web api 配置Sencha';s Rest代理不发送模型';他在一个柱子上的身份证

Asp.net web api 配置Sencha';s Rest代理不发送模型';他在一个柱子上的身份证,asp.net-web-api,sencha-touch-2,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: '

我有一个简单的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代理的存储中。当我向应用商店添加新模型并调用应用商店上的Sync方法时,新模型将发布到ASP.NET WebAPIUsers控制器,并点击以下操作:

    // 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字段被设置为字符串吗?另外,我知道如何告诉用户控制器中的post操作不验证id字段(因为它应该处理创建新项目的操作,所以服务器为新项目而不是客户端创建id是有意义的)。

您需要在模型上设置idProperty。id字段也应设置为自动类型。请参阅文档

这帮助我找到了答案。更新后的模型应为:

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

谢谢你的建议。有两件事:我看到idProperty默认为id,这是我在模型中拥有的字段之一。因此,我认为不需要添加idProperty配置选项。我确实将类型更改为auto,但是id属性仍然被发送到服务器,并且模型验证失败。如果我遗漏了一些东西,请您发布您建议如何修改模型?您是否尝试过将idProperty设置为id,即使您不必这样做?我发现在过去这可以解决我的问题。现在我坚持使用idProperty字段,这些字段没有名称“id”,以避免任何混淆。是的,我有。看起来我仍然不需要保留ID,因为MVC WebAPI在json对象到达控制器之前就尝试将其转换为类型化对象。因此,我只使用模型放置的位置(用于更新),例如user/1,在通过验证后在控制器中设置用户的id。