6

ASP.NET MVC 2では、ASP.NET MVC 1の属性の「省略形」として、いくつかの新しいアクションフィルター属性が導入されました。たとえば、を適用すると、アクションメソッドにHttpPostAttribute適用するのと同じことが行われます。[AcceptVerbs(HttpVerbs.Post)]

Postさらに、より冗長な構文を使用すると、たとえばとの両方を許可するために、さまざまなメソッドを組み合わせることができますDelete

今、私は疑問に思っています:新しい属性はどのように機能しますか?[HttpPost]との両方を適用した場合[HttpDelete]、ASP.NET MVC 2は両方を許可しますか、それとも両方を必要としますか(したがって、何も許可しません)?

4

4 に答える 4

5

ActionMethodSelector のコードを見ると、すべてのアクション メソッド属性が IsValidForRequest に対して true を返さなければ、そのアクションが可能な一致メソッドのセットに追加されないように見えます。HttpPost と HttpDelete が同じリクエストに対して IsValidForRequest を返すことはできないため、両方を使用すると、そのアクションがどのリクエストとも一致しなくなります。

コードからのわかりやすいコメントは次のとおりです。

private static List RunSelectionFilters(...) { // このリクエスト からオプトアウトして
いるすべてのメソッドを削除します// オプトアウトするには、メソッドで定義された少なくとも 1 つの属性が false を返す必要があります

(私のものを強調)

いずれかを一致させる必要がある場合は、引き続き AcceptVerbs を使用し、動詞の明示的なORを使用できることに注意してください。

編集- ここに HttpPostOrDelete 属性があります。

[AttributeUsage( AttributeTargets.Method, AllowMultiple = false, Inherited = false )]
public class HttpPostOrDeleteAttribute : ActionMethodSelectorAttribute
{
    private static readonly AcceptVerbsAttribute _innerPostAttribute = new AcceptVerbsAttribute( HttpVerbs.Post );
    private static readonly AcceptVerbsAttribute _innerDeleteAttribute = new AcceptVerbsAttribute( HttpVerbs.Delete );

    public override bool IsValidForRequest( ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo )
    {
        return _innerDeleteAttribute.IsValidForRequest( controllerContext, methodInfo )
               || _innerPostAttribute.IsValidForRequest( controllerContext, methodInfo );
    }
}
于 2010-04-15T20:44:36.703 に答える
4

MVCのすべてのフィルターは、例外なく、互いに独立しています。MVCフレームワークのどこにも特別な場合のフィルターはありません。これは意図的な設計上の決定であり、呼び出し側のようなMVCフレームワークコンポーネントは、MVCバイナリにあるフィルターを、アプリケーション開発者が作成したフィルターとは異なる方法で「ごまかして」処理することができません。

したがって、呼び出し元が同じメソッドで[HttpGet]と[HttpPost]を確認した場合、2つの結合を取得するための特別なコードはありません。それらは独立して実行されます。また、同じリクエストに対してtrueを返すことはできないため、[HttpGet、HttpPost]は、特定のメソッドをアクションメソッドから事実上除外します。

于 2010-04-15T21:14:33.133 に答える
3

連鎖に AcceptVerbs を使用できます。

[AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)]
public ActionResult Customers() {
}

また

[AcceptVerbs("GET","POST")]
public ActionResult Customers() {
}
于 2010-10-23T00:55:46.953 に答える
0

一緒[HttpPost][HttpDelete]すると、両方が必要になります(これは不可能です)と思います。チェーン[HttpGet]すると、どちらも機能しません...

[HttpPost]既存のアクション メソッドを取得して追加するだけで、簡単にテストできます[HttpDelete]。投稿は機能しなくなります。

あなたの提案のようにチェーンする必要がある例は見つかりませんでした。

于 2010-04-15T20:44:10.923 に答える