ASP.NET MVC在绑定传入请求的模型时使用的优先顺序在REST的上下文中困扰着我。从本质上讲,MVC使用以下优先顺序的值绑定模型:
困扰我的是如何利用来自信息正文的价值来胜过资源的Uri。
例如,我可以按如下方式公开RESTful资源:
/dogs/
......回归:
[{
'name': 'Fido',
'color': 'brown',
'_links': {
'self': { 'href': '/dogs/7' }
}
},
{
'name': 'Spot',
'color': 'spotted',
'_links': {
'self': { 'href': '/dogs/5' }
}
}]
请注意,使用“自我”链接(HAL样式),我可以通过将这些资源放回服务器而不需要其“id”值来修改狗所需的一切。
PUT /dogs/7
{
'name': 'Super Fido',
'color': 'rainbow'
}
服务器拥有更新狗所需的一切,没有任何混淆。 MVC将模型 - 将所有内容很好地绑定到我的模型中,包括id(来自路由)。
但是,我看到的一些API样式包括消息体中的“id”,所以它看起来像这样:
GET /dogs/7
{
'id': 7,
'name': 'Super Fido',
'color': 'rainbow'
}
但从根本上说最困扰我的是,如果我有一个定义为“{controller} / {id}”的路由,并且客户端执行以下操作:
PUT /dogs/7
{
'id': 5,
'name': 'Snowy',
'color': 'white'
}
...然后MVC将模型绑定'id'到5(来自消息体),而不是7(来自路由),但是基于我的客户提供的资源URI,他们应该更新Fido的信息。这类似于尝试将文档保存到特定位置的硬盘驱动器,并且由于文档中的某些内容,将其自动保存在其他位置。
如何在ASP.NET MVC中更改开箱即用的模型绑定优先级以优先考虑消息体上的路由值(当存在冲突时),这将是一件好事这个背景?