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

S.A*_*.A. 19 c# asp.net-mvc action-filter asp.net-mvc-4 asp.net-web-api

现在我可以请一个比较,而不仅仅是一个定义.

例:

SomeClassAttribute (or ISomeClassAttribute)
Run Code Online (Sandbox Code Playgroud)

VS

SomeClassFilter (or ISomeClassFilter)
Run Code Online (Sandbox Code Playgroud)

我觉得它们可以以相同的方式使用,但一般来说"应用属性"和"过滤器是它们产生的功能".所以我可以"为方法(或类或其他)添加属性以应用过滤器.

asy*_*ult 12

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

你在那句话中得到了它. 过滤器属性不是完全可比较的概念,它们提供两种不同的功能.

我相信这篇MSDN文章非常清楚地介绍了MVC中的过滤.

属性(至少应用于过滤器的属性)标记过滤器应用于什么,即操作方法或控制器.一个例子是Authorize属性.此属性对应于实现接口的AuthorizationFilterIAuthorizationFilter.将该Authorize属性应用于动作方法告诉M​​VC授权针对该动作方法的请求,将其应用于控制器告知MVC授权针对控制器的动作方法的任何请求,或者也可以全局地对所有请求应用授权.现在我说过,至少那些适用于过滤器的,因为属性是.NET的概念和语法而不仅仅是MVC.有许多其他东西的属性,并且通常提供有关应用它们的属性,方法,类的其他信息.


Ste*_*man 5

属性是 .NET 的一项功能,MVC 过滤器是使用该功能实现的。

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


小智 5

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

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

void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new AuthorizeAttribute());
}
Run Code Online (Sandbox Code Playgroud)