【问题标题】:partial update with asp.net web api使用 asp.net web api 进行部分更新
【发布时间】:2012-04-25 22:17:02
【问题描述】:

我使用 web api 和 dbContext 在 asp.net mvc 3 中创建了一个简单的待办事项列表应用程序。 (带有主干和客户端的requirejs) 一切正常,但我有点担心如果我选中或取消选中待办事项项,我必须将整个模型发送到服务器。 我只想在提交数据时发送“完成”字段。

我应该提到我也在使用 JsonNetFormatter 来使用 JSON.NET 作为默认的序列化器(这里解释:http://blogs.msdn.com/b/henrikn/archive/2012/02/18/using-json-net-with-asp-net-web-api.aspx)。

目前这是我更新模型的api控制器方法

public HttpResponseMessage Put(Todo todo)
{
    _db.Entry(todo).State = EntityState.Modified;
    _db.SaveChanges();
    return new HttpResponseMessage(HttpStatusCode.NoContent);
}

将其作为json数据

{"content":"Pick up milk","done":false,"id":10}

当然这可行,但它正在更新整个模型,它应该只更新 1 个字段。 我可以实现只将更改的字段从浏览器发送到服务器,但我不确定 web api 方法应该是什么样子。 我正在考虑使用 FormCollection 做一些事情,但这似乎不适用于 web api,因为它似乎试图将提交的表单值直接序列化为 FormCollection 类型,我收到此错误。

Cannot deserialize JSON object (i.e. {"name":"value"}) into type 'System.Web.Mvc.FormCollection'.

如何将模型中 1 个或多个字段的部分更新发送到我的 Web api? 我只想将更新的字段发送到服务器,然后从那里只将这些字段更新到数据库。我当然不想在更新之前查询数据库。

【问题讨论】:

    标签: c# asp.net-mvc json.net asp.net-web-api


    【解决方案1】:

    一种方法是使用名为Automapper 的工具并对其进行配置,以便在映射 Todo 对象时空值不会覆盖现有值。例如:

      Mapper.CreateMap<Todo,Todo>()
            .ForMember(d => d.Id, o => o.Ignore())
            .ForAllMembers(mo => mo.Condition(cond => !cond.IsSourceValueNull));  
    

    然后您只需将接收到的对象值映射到现有的值,如下所示:

      Mapper.Map(todo, item);
    

    另一个建议是使用 PATCH 而不是 PUT,即 more appropriate to partial updates of resources according to REST

    【讨论】:

    • 不卖这个。如果你想设置一个字段为空怎么办?
    • 您无法判断空值是由发送者设置的,还是只是由于省略了字段而设置的。在这种情况下,我建议改用 PATCH 动词。
    【解决方案2】:

    您需要从数据库中查询原始对象,设置其属性并调用_db.SaveChange()

    public HttpResponseMessage Put(Todo todo){
    var item = _db.Todo.First(i => i.id = todo.id);
    item.Content = todo.Content;
    item.Done = todo.Done;
    _db.SaveChanges();
    return new HttpResponseMessage<Todo>(HttpStatusCode.Accepted);
    }
    

    参考:http://msdn.microsoft.com/en-us/library/dd456854.aspx

    【讨论】:

    • 这不能回答问题
    猜你喜欢
    • 2017-12-09
    • 2013-12-02
    • 1970-01-01
    • 2014-06-28
    • 2013-11-11
    • 2016-07-08
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多