2013-08-29 35 views
13

现在我可以请一个比较而不只是一个定义。MVC中的属性和过滤器有什么区别

实施例:

SomeClassAttribute (or ISomeClassAttribute) 

VS

SomeClassFilter (or ISomeClassFilter) 

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

回答

10

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

你已经明白了那句话。 过滤器属性并不完全可比较的概念,它们提供两种不同的功能。

我相信MVC中的过滤在这个MSDN article中已经很好地涵盖了。

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

3

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

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

void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new AuthorizeAttribute()); 
} 
相关问题