web-dev-qa-db-ja.com

MVCの属性とフィルターの違いは何ですか

さて、定義だけでなく比較をお願いします。

例:

SomeClassAttribute (or ISomeClassAttribute)

VS

SomeClassFilter (or ISomeClassFilter)

同じように使用できますが、一般的には「属性が適用されます」と「フィルターはそれらが生成する機能です」と感じています。そのため、「属性をメソッド(またはクラスなど)に追加して、フィルターを適用できます。

19
S.A.

"だから、「フィルタを適用するためにメソッド(またはクラスなど)に属性を追加できます。」

あなたはすぐそこにその文でそれを持っています。 FiltersおよびAttributesは厳密に比較可能な概念ではなく、2つの異なる機能を提供します。

MVCでのFilteringは、この MSDN記事 で非常によくカバーされていると思います。

Attributes(少なくともフィルターに適用される属性)は、フィルターが適用される対象、つまりアクションメソッドまたはコントローラーをマークします。例はAuthorize属性です。この属性は、IAuthorizationFilterインターフェイスを実装するAuthorizationFilterに対応します。 Authorize属性をアクションメソッドに適用すると、MVCはそのアクションメソッドをターゲットとするリクエストを承認し、コントローラーに適用すると、コントローラーのアクションメソッドをターゲットとするリクエストを承認するようMVCに指示します。すべてのリクエストに対して。さて、AttributesはMVCだけではなく.NETの概念と構文であるため、少なくともフィルターに適用されるものについては前に述べました。他にも非常に多くの属性があり、一般に、それらが適用されるプロパティ、メソッド、クラスに関する追加情報を提供します。

12
asymptoticFault

ほとんどの場合、属性はメソッド/クラス/などに関するメタデータを記述するために使用されます。たとえば、クラスをシリアル化できることを示すSerializable属性、クラスをテストとしてマークするTestClass属性、および古いものとしてマークするObsolete属性があります。リフレクションは、使用したいプロセスによってこの情報を抽出するために使用されます。これについてはよく説明されています question 属性について。

AuthorizeAttribute などのMVCのフィルター属性は、他の属性と同様の追加情報を伝達します。AuthorizeAttributeで修飾されたコントローラーメソッドまたはクラスは、MVCで使用する場合に承認が必要であることを示します。しかし、他のいくつかの属性とは異なり、フィルター属性自体には実際の機能を実行するロジックが含まれています-AuthorizeAttributeはAttribute(FilterAttribute経由)およびimplementsIAuthorizationFilter。 MVCは、AuthorizeAttributeで修飾されたコントローラークラスを見つけると、AuthorizeAttribute.OnAuthorization()メソッドを呼び出して承認を実行します。また、グローバルフィルターを指定する場合は、属性クラス自体をフィルターリストに追加しますが、これは少し混乱する可能性がありますが、その仕組みは次のとおりです。

void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new AuthorizeAttribute());
}
5
Dusklight

属性は.NETの機能であり、MVCフィルターはその機能を使用して実装されます。

たとえば、 System.Web.Mvc.HandleErrorAttribute はBCLから派生します System.Attribute 。フィルターは、フックを介してMVCパイプラインに動作を適用します(大まかに言って)。

4
SteveChapman