MVC中的属性和filter有什么区别

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

例:

SomeClassAttribute (or ISomeClassAttribute) 

VS

 SomeClassFilter (or ISomeClassFilter) 

我觉得它们可以以相同的方式使用,但一般来说“应用属性”和“filter是它们产生的function”。 所以我可以“为方法(或类或其他)添加属性以应用filter。

“所以我可以”为方法(或类或其他)添加一个属性来应用filter。“

你在那句话中得到了它。 filter属性不是完全可比较的概念,它们提供两种不同的function。

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

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

属性是.NET的一个特性,MVCfilter是使用该function实现的。

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

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

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

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