質問

[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 }
           );
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top