C# 使用asp.net web api进行部分更新

C# 使用asp.net web api进行部分更新,c#,asp.net-mvc,json.net,asp.net-web-api,C#,Asp.net Mvc,Json.net,Asp.net Web Api,我使用web api和dbContext在asp.net mvc 3中创建了一个简单的待办事项列表应用程序。(具有主干网和客户需求) 一切都很好,但我有点担心,如果我按原样选中或取消选中todo项,就必须将整个模型发送到服务器。 我只希望在提交数据时发送“完成”字段 我应该提到的是,我还使用JsonNetFormatter将JSON.NET用作默认序列化程序(此处解释:) 目前这是我的api控制器更新模型的方法 public HttpResponseMessage Put(Todo todo)

我使用web api和dbContext在asp.net mvc 3中创建了一个简单的待办事项列表应用程序。(具有主干网和客户需求) 一切都很好,但我有点担心,如果我按原样选中或取消选中todo项,就必须将整个模型发送到服务器。 我只希望在提交数据时发送“完成”字段

我应该提到的是,我还使用JsonNetFormatter将JSON.NET用作默认序列化程序(此处解释:)

目前这是我的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?
我只想将更新后的字段发送到服务器,然后从服务器将这些字段更新到数据库。我当然不想在更新之前查询数据库。

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

public httpresponsemessageput(Todo Todo){
var item=_db.Todo.First(i=>i.id=Todo.id);
item.Content=todo.Content;
item.Done=待办事项完成;
_db.SaveChanges();
返回新的HttpResponseMessage(HttpStatusCode.Accepted);
}

参考:

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

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

另一个建议是使用补丁而不是PUT,因为PUT是。

这并不能回答这个问题,因为它没有在本机上销售。如果要将字段设置为null,该怎么办?您无法判断null值是由发送方设置的,还是仅由忽略字段的事实设置的。在这种情况下,我建议改用PATCH动词。
  Mapper.CreateMap<Todo,Todo>()
        .ForMember(d => d.Id, o => o.Ignore())
        .ForAllMembers(mo => mo.Condition(cond => !cond.IsSourceValueNull));  
  Mapper.Map(todo, item);