ASP.NET MVC AcceptVerbsおよびルートの登録
-
08-07-2019 - |
質問
[AcceptVerbs(..)]属性でアクションメソッドを既に装飾している場合、ルート定義にHttpVerb制約を登録する必要がありますか(ルートを登録するとき)?
eg。これがあります。
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection formCollection)
{ .. }
制約として、このアクションを参照するルートにこれを追加する必要がありますか?
解決
2つの違いは次のとおりです。問題の Create
メソッドが HomeController
上にあると仮定しましょう。
AcceptVerbs
属性を使用しても、ルーティングには影響しません。実際には、アクション呼び出し側によって使用されるものです。それができることは、それぞれが異なるHTTPメソッドに応答する同じ名前のコントローラー上に2つのアクションメソッドを持つことです。
public ActionResult Create(int id) { .. }
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection formCollection) { .. }
したがって、 / home / create
のリクエストが到着すると、ルートは一致し、リクエストをコントローラの呼び出し側に渡します。次に、呼び出し側は AcceptVerbs
属性を見て正しいメソッドを呼び出します。
ルーティングで HttpMethodConstraint
を使用すると、ルート自体がリクエストに一致しないようになります。したがって、POSTリクエストが / home / create
に着信すると、そのルートはリクエストと一致しないため、どちらのアクションメソッドも呼び出されません。ただし、別のルートがそのリクエストと 一致する可能性があります。
ここで重複する理由の一部は、ルーティングがASP.NET 3.5 SP1の機能であり、MVCに固有ではないことです。 MVCはルーティングを使用しますが、ルーティングは動的データでも使用され、ASP.NET Webフォームとルーティングを統合する予定です。
他のヒント
いいえ-CreateはPOSTリクエストにのみ応答します。
異なるAcceptVerb属性を持つCreateの他の実装を持つことも、他のすべてのリクエストをキャッチする属性を持たない実装を持つこともできます。
それが唯一のCreateメソッドである場合、GET(または他の非POST)要求はすべて404になります。
とにかく、これはすべてルーティングエンジンによって行われていると思います。 [編集:いいえ、Haackedの投稿を参照]
最初にこのように飾ります:
[ActionName("ItemEdit"), AcceptVerbs(HttpVerbs.Post)]
public virtual object ItemSave(Menu sampleInput)
次のようなルートを追加する必要があります:
AddRoute(
"SampleEdit",
"Admin/{sampleID}/Edit",
new { controller = "Sample", action = "ItemEdit", validateAntiForgeryToken = true },
new { areaID = new IsGuid() },
new { Namespaces = controllerNamespaces }
);