ASP.NET MVC模型绑定优先级与RESTful资源

时间:2012-10-21 22:35:05

标签: asp.net-mvc rest model-binding restful-url restful-architecture

ASP.NET MVC在绑定传入请求的模型时使用的优​​先顺序在REST的上下文中困扰着我。从本质上讲,MVC使用以下优先顺序的值绑定模型:

  • POST body
  • 路线(URL)
  • 查询字符串值

困扰我的是如何利用来自信息正文的价值来胜过资源的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中更改开箱即用的模型绑定优先级以优先考虑消息体上的路由值(当存在冲突时),这将是一件好事这个背景?

0 个答案:

没有答案