2

次のルートが与えられます:

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制約が必要なのですか?

4

1 に答える 1

2

それはそうです。これがMVCパイプラインでどのように機能するかをもう少し詳しく見てみると、これを処理するのは実際にはMVC(ActionMethodSelectorAttribute、ActionInvoker、RedirectToRoute)であり、RouteModuleではありません。

したがって、ルートモジュールでは、これは「PUT」ではなく「POST」リクエストです。

于 2012-02-02T14:49:31.600 に答える