21

现在我可以进行比较,而不仅仅是一个定义。

例子:

SomeClassAttribute (or ISomeClassAttribute)

VS

SomeClassFilter (or ISomeClassFilter)

我有一种感觉,它们可以以相同的方式使用,但一般来说“应用属性”和“过滤器是它们产生的功能”。所以我可以“将属性添加到方法(或类或其他)以应用过滤器。

4

3 回答 3

13

“所以我可以“向方法(或类或其他)添加属性以应用过滤器。”

你在那个句子里就明白了。 过滤器属性不是完全可比的概念,它们具有两种不同的功能。

我相信这篇MSDN 文章很好地介绍了 MVC 中的过滤

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

于 2013-08-29T12:48:59.890 回答
5

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

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

void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new AuthorizeAttribute());
}
于 2015-11-23T03:35:02.550 回答
4

属性是 .NET 的一个特性,MVC 过滤器是使用该特性实现的。

例如,System.Web.Mvc.HandleErrorAttribute派生自 BCL System.Attribute。过滤器通过钩子将行为应用到 MVC 管道中(粗略地说)。

于 2013-08-29T22:58:46.790 回答