目前最新不支持stableWeb API 发布(从 2012 年 8 月开始)。因此,如果您只想使用 Web API RTM,则必须自己实现整个管道。
话虽如此,OData 预发布包通过新的Delta<T>
目的。
目前 Microsoft.AspNet.WebApi.OData 包已经是 RC 版本 (0.3),可以从这里获取:http://www.nuget.org/packages/Microsoft.AspNet.WebApi.OData http://www.nuget.org/packages/Microsoft.AspNet.WebApi.OData
安装后,您就可以相应地使用它:
[AcceptVerbs("PATCH")]
public void Patch(int id, Delta<Person> person)
{
var personFromDb = _personRepository.Get(id);
person.Patch(personFromDb);
_personRepository.Save();
}
你可以从客户端这样调用它:
$.ajax({
url: 'api/person/1',
type: 'PATCH',
data: JSON.stringify(obj),
dataType: 'json',
contentType: 'application/json',
success: function(callback) {
//handle errors, do stuff yada yada yada
}
});
这样做的明显优点是它适用于任何属性,并且您不必关心是否更新Email
or Username
或者诸如此类的。
您可能还想查看这篇文章,因为它展示了一种非常相似的技术http://techbrij.com/http-patch-request-asp-net-webapi http://techbrij.com/http-patch-request-asp-net-webapi
编辑(更多信息):为了只需使用补丁,您不需要启用任何与 OData 相关的内容,除了添加 OData 包 - 即可访问Delta<TEntityType>
object.
然后你可以这样做:
public class ValuesController : ApiController
{
private static List<Item> items = new List<Item> {new Item {Id = 1, Age = 1, Name = "Abc"}, new Item {Id = 2, Age = 10, Name = "Def"}, new Item {Id = 3, Age = 100, Name = "Ghj"}};
public Item Get(int id)
{
return items.Find(i => i.Id == id);
}
[AcceptVerbs("PATCH")]
public void Patch(int id, Delta<Item> item)
{
var itemDb = items.Find(i => i.Id == id);
item.Patch(itemDb);
}
}
如果您的物品是,我们可以这样说:
{
"Id": 3,
"Name": "hello",
"Age": 100
}
您可以修补到/api/values/3
with:
{
"Name": "changed!"
}
这将正确更新您的对象。
Delta<TEntity>
将为您跟踪更改。它是一个动态类,充当类型的轻量级代理,并将理解原始对象(即来自数据库)和客户端传递的对象之间的差异。
这不会以任何方式影响 API 的其余部分(当然,除了用较新的 DLL 替换以促进 OData 包依赖性之外)。
我添加了一个示例项目来演示 PATCH + Delta 的工作 - 你可以在这里获取它(it.s VS2012)https://www.dropbox.com/s/hq7wt3a2w84egbh/MvcApplication3.zip https://www.dropbox.com/s/hq7wt3a2w84egbh/MvcApplication3.zip