次のルートが与えられます:
context.MapRoute(null, "widgets",
new { controller = "Widgets", action = "Add" },
new { httpMethod = new HttpMethodConstraint("PUT") });
そして、次のコントローラー:
public class WidgetsController
{
[HttpPut]
public ActionResult Add(WidgetForm model)
{
return DoStuff(); // code here doesn't matter
}
}
そして、次のフォームをレンダリングするビュー(使用HtmlHelper.@Html.HttpMethodOverride(HttpVerbs.Put)
:
<form action="/widgets" method="post">
<!-- many form elements, then -->
<input name="X-HTTP-Method-Override" type="hidden" value="PUT" />
</form>
フォームが送信されると、MVCアクションメソッドセレクターは上記のアクションメソッドを選択しません。開始中括弧にブレークポイントを設定すると、ヒットしません。ブラウザでは、404ページが返されます(これがデフォルトのActionNotFoundの動作であると思います)。
ただし、アクションメソッドセレクターは、次のルートでAddHttpPutメソッドを選択します。
context.MapRoute(null, "widgets",
new { controller = "Widgets", action = "Add" },
new { httpMethod = new HttpMethodConstraint("PUT", "POST") });
これは正しくないようです...そうですか?POSTの制約なしでこれを実行できるはずだと私には思えます。アクションメソッドはHttpPostで装飾されていないのに、なぜPOST制約が必要なのですか?