asp web api补丁实现

Wil*_*eer 17 c# asp.net rest model asp.net-web-api

假设我有这个模型

public partial class Todo
{
    public int id { get; set; }
    public string content { get; set; }
    public bool done { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我将此作为json数据发送到我的控制器作为补丁请求.这绝对是一个复选框的动作.我认为它只是想把它发送到我的服务器,而不是整个模型.

{ "id":1, "done" : true }
Run Code Online (Sandbox Code Playgroud)

为了正确处理这个简单的json补丁请求,我的WebApi控制器需要看起来是什么样的?我应该使用web api,还是应该使用更多rpc风格的mvc方法?

这似乎是一件非常基本的事情,但我似乎无法做到正确!我想我可能需要在我的控制器方法中使用不同的参数,但我不确定.

感谢您的时间.

Dar*_*ler 12

将方法更改为PATCH不会以任何方式更改Web API行为.没有用于进行部分更新的内置机制.长期没有PATCH方法的原因之一是没有普遍存在的媒体类型来将补丁应用于资源.

其次,您要求Web API为您执行对象序列化,因此没有应用部分更新对象的概念.会有很多约定要达成一致,null值是什么意思,空值怎么样,我怎么说"不要更新这个DateTime".相关对象,子项目怎么样?如何删除子项目?除非CLR团队实现某种类型的概念,该概念只包含来自另一种类型的成员的子集,否则部分更新和对象序列化不能很好地结合在一起.

Aliostad提到UpdateModel,从HTML表单更新时可以这样做,因为媒体类型application/x-www-form-urlencoded明确允许任意一组名称值对.没有"对象序列化"正在进行.它只是匹配表单中的名称与Model对象上的名称的匹配.

对于我自己,我创建了一种新的媒体类型,用于进行部分更新,其工作方式类似于表单,但更先进,因为它可以处理分层数据,并维护更新的顺序.


Mak*_*jer 12

您可以在OData预发行版Nuget包中找到PATCH功能:Microsoft.AspNet.WebApi.OData.

有关如何使用它来创建处理PATCH的操作的信息可以在博客文章的部分更新(PATCH请求)部分中找到,该部分关于ASP.NET Web API中的OData支持.