ASP.NET MVC が着信要求のモデルをバインドするときに使用する優先順位は、REST のコンテキストでは気になります。基本的に、MVC は次の優先順位で値を使用してモデルをバインドします。
- 投稿本文
- ルート(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 することで、犬を変更するために必要なものがすべて揃っていることに注意してください。
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 ですぐに使えるモデル バインディングの優先順位を変更して、(競合が存在する場合) メッセージ本文よりもルート値を優先させるにはどうすればよいでしょうか。