MVC中属性和过滤器之间的区别是什么

本文关键字:区别 是什么 之间 过滤器 属性 MVC | 更新日期: 2023-09-27 18:29:24

现在我可以得到一个比较而不仅仅是一个定义吗。

示例:

SomeClassAttribute (or ISomeClassAttribute)

SomeClassFilter (or ISomeClassFilter)

我有一种感觉,它们可以用同样的方式使用,但一般来说,"应用一个属性","过滤器是它们产生的功能。"所以我可以"向一个方法(或类或其他什么)添加一个属性来应用过滤器。

MVC中属性和过滤器之间的区别是什么

"所以我可以"将属性添加到方法(或类或其他)应用过滤器。"

你就在那句话里过滤器和属性不是完全可比较的概念,它们具有两种不同的功能。

我相信这篇MSDN文章已经很好地介绍了MVC中的Filtering

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

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

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

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

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

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