2

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' }
    }
}]

请注意,使用“self”链接(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 中的开箱即用模型绑定优先级以优先于消息正文(当存在冲突时)的路由值,在这种情况下这样做是一件好事吗?

4

0 回答 0