繁体   English   中英

使用ASP.NET Web API进行部分更新

[英]partial update with asp.net web api

我使用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,因为它似乎试图将提交的formvalues直接序列化为FormCollection类型,但出现此错误。

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

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

一种方法是使用一个名为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,这更适合根据REST对资源进行部分更新

您需要从数据库中查询原始对象,设置其属性并调用_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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM