アクションメソッドを[AcceptVerbs(..)]属性で既に装飾している場合、ルート定義にHttpVerb制約を登録する必要がありますか(ルートを登録する場合)?
例えば。私はこれを持っています。
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection formCollection)
{ .. }
制約として、このアクションを参照するルートにこれを追加する必要がありますか?
アクションメソッドを[AcceptVerbs(..)]属性で既に装飾している場合、ルート定義にHttpVerb制約を登録する必要がありますか(ルートを登録する場合)?
例えば。私はこれを持っています。
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection formCollection)
{ .. }
制約として、このアクションを参照するルートにこれを追加する必要がありますか?
2 つの違いは次のとおりです。Create
問題のメソッドが にあると仮定しましょうHomeController
。
属性を使用してAcceptVerbs
も、ルーティングには影響しません。これは、実際にはアクション インボーカーによって使用されるものです。これにより、コントローラーに同じ名前の 2 つのアクション メソッドがあり、それぞれが異なる HTTP メソッドに応答することができます。
public ActionResult Create(int id) { .. }
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection formCollection) { .. }
そのため、リクエストが/home/create
来ると、ルートが一致し、コントローラの呼び出し側にリクエストが渡されます。次に、呼び出し元は、AcceptVerbs
属性を確認して正しいメソッドを呼び出します。
in ルーティングを使用する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 }
);