MVC中属性和过滤器有什么区别?

24
现在我能否得到一个比较而不仅仅是定义。
例子:
SomeClassAttribute (or ISomeClassAttribute)

VS

SomeClassFilter (or ISomeClassFilter)

我的感觉是它们可以以类似的方式使用,但一般来说,“属性被应用”,而“过滤器则是它们所产生的功能”。因此,我可以“向方法(或类或其他任何内容)添加属性以应用过滤器。”

3个回答

16

"因此我可以向方法(或类或其他)添加属性来应用过滤器。"

您在这个句子中已经理解了它。 过滤器属性并不是完全可比的概念,它们有着不同的功能。

我认为MVC中的过滤器在这篇MSDN文章中有很好的介绍。

属性(至少适用于过滤器)标记了过滤器所应用的内容,例如操作方法或控制器。一个例子是Authorize属性。该属性对应实现IAuthorizationFilter接口的AuthorizationFilter。将Authorize属性应用于操作方法告诉MVC授权请求以针对该操作方法,将其应用于控制器告诉MVC授权任何请求以针对控制器的操作方法,或者还可以全局应用于所有请求。我之前说过,至少适用于过滤器,因为属性是.NET框架的概念和语法,而不仅仅是MVC。还有许多其他东西的属性,通常用于提供有关所应用的属性、方法、类的附加信息。


我可以说MVC过滤器是一种特殊的属性吗? - Bigeyes

6
在大多数情况下,属性用于描述方法/类等的元数据。例如,有Serializable属性表示一个类可以被序列化,TestClass属性将一个类标记为测试,Obsolete属性将某些内容标记为过时。反射用于通过想要使用它们的进程提取此信息。在这个问题中,关于属性的内容已经很详细地介绍了。

MVC 中的过滤器属性,比如 AuthorizeAttribute,传递类似于其他属性的额外信息 -- 被 AuthorizeAttribute 修饰的控制器方法或类表示在 MVC 中需要进行授权。但与某些其他属性不同的是,过滤器属性本身包含执行实际功能的逻辑 -- AuthorizeAttribute 派生自 Attribute(通过 FilterAttribute),并且还 实现 IAuthorizationFilter。当 MVC 发现被 AuthorizeAttribute 修饰的控制器类时,它会调用 AuthorizeAttribute.OnAuthorization() 方法来执行授权。此外,在指定全局过滤器时,将属性类本身添加到过滤器列表中可能有点令人困惑,但这就是它的工作方式:

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

5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接