假设我有这样的模型
public partial class Todo
{
public int id { get; set; }
public string content { get; set; }
public bool done { get; set; }
}
我将此作为json数据作为补丁请求发送到我的控制器。这仅仅是勾选一个复选框的动作。我认为我只想把它发送到我的服务器,而不是整个模型,这是有意义的。
{ "id":1, "done" : true }
为了正确处理这个简单的WebApi补丁请求,我的json控制器需要看起来像什么?我应该为此使用web api,还是应该在mvc中使用一种更具rpc风格的方法?
这似乎是一件非常基本的事情,但我似乎不能把它做对!我想我可能需要在我的控制器方法中使用一个不同的参数,但我不确定。
谢谢您抽时间见我。
发布于 2012-04-26 20:36:33
将方法更改为PATCH不会以任何方式更改Web API行为。没有用于进行部分更新的内置机制。这么长时间没有补丁方法的原因之一是没有无处不在的媒体类型来将补丁应用于资源。
其次,您要求Web API为您执行对象序列化,因此不存在应用部分更新的对象的概念。有太多的约定需要达成一致,空值意味着什么,空值怎么办,我该如何说“不更新这个DateTime”。那么相关的对象、子项呢?如何删除子项?除非CLR团队实现只包含来自另一个类型的成员子集的某个类型概念,否则部分更新和对象序列化将不能很好地配合使用。
Aliostad提到了UpdateModel,当从HTML表单更新时,这是可能的,因为媒体类型application/x-www-form-urlencoded
显式地允许一组任意的名称值对。没有正在进行的“对象序列化”。它只是表单中的名称与Model对象上的名称的匹配。
对于我自己来说,我创建了一个新的媒体类型,我使用它来进行部分更新,它的工作方式类似于表单,但它更高级,因为它可以处理分层数据,并维护更新的顺序。
发布于 2012-04-26 20:29:00
ASP.NET Web API似乎缺少UpdateModel
、TryUpdateModel
等。
在ASP.NET MVC中,您可以使用它们来实现所需的效果。我已经在ASP.NET Web Stack中创建了一个work item,您可以投票支持它,如果它获得足够的票数,它将被实现。
https://stackoverflow.com/questions/10332809
复制相似问题