我使用web api和dbContext在asp.net mvc 3中创建了一个简单的待办事项列表应用程序。 (主干和客户的requirejs) 一切正常,但我有点担心,如果我检查或取消选中待办事项,我必须将整个模型发送到服务器。 我想在提交数据时只发送“完成”字段。
我应该提一下,我也使用JsonNetFormatter将JSON.NET用作默认的Serializer(在此解释: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'.
如何将模型中的一个或多个字段的部分更新发送到我的网络API? 我只想将更新的字段发送到服务器,并从那里只将这些字段更新到数据库。我当然不希望在更新之前查询数据库。
答案 0 :(得分:2)
一种方法是使用名为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。
答案 1 :(得分:-3)
您需要从数据库中查询原始对象,设置其属性&amp;调用_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);
}