使用 asp.net Web API 进行部分更新



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

我应该提到,我也在使用 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'.

如何将模型中一个或多个字段的部分更新发送到我的 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。保存更改()

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

相关内容

  • 没有找到相关文章

最新更新