现在我可以进行比较,而不仅仅是定义。
示例:
SomeClassAttribute (or ISomeClassAttribute)
VS
SomeClassFilter (or ISomeClassFilter)
我觉得它们可以以相同的方式使用,但一般来说“应用属性”和“过滤器是它们产生的功能”。所以我可以“为方法(或类或其他)添加属性以应用过滤器。
答案 0 :(得分:12)
“所以我可以”将方法(或类或其他)的属性添加到 应用过滤器。“
你在那句话中得到了它。 过滤器和属性不是完全可比较的概念,它们提供两种不同的功能。
我相信MVC中的过滤非常适合MSDN article。
属性(至少适用于过滤器的那些)标记过滤器应用于什么,即操作方法或控制器。一个例子是Authorize
属性。此属性对应于实现IAuthorizationFilter
接口的 AuthorizationFilter 。将Authorize
属性应用于操作方法告诉MVC授权针对该操作方法的请求,将其应用于控制器告知MVC授权针对控制器的操作方法的任何请求,或者也可以全局应用授权。所有要求。现在我说过,至少那些适用于过滤器的,因为属性是.NET的概念和语法而不仅仅是MVC。有许多其他东西的属性,通常是提供有关应用它们的属性,方法,类的其他信息。
答案 1 :(得分:5)
在大多数情况下,属性用于描述有关方法/类/等的元数据。例如,可以使用Serializable属性来指示可以序列化类,使用TestClass属性将类标记为测试,使用Obsolete属性将某些内容标记为过时。反射用于通过想要使用它们的进程提取此信息。这个question关于属性的内容很好。
MVC中的过滤器属性(如AuthorizeAttribute)传达类似于其他属性的额外信息 - 由AuthorizeAttribute修饰的控制器方法或类表示MVC使用时需要授权。但与其他一些属性不同,过滤器属性本身包含执行实际功能的逻辑 - AuthorizeAttribute派生自属性(通过FilterAttribute)以及实现 IAuthorizationFilter 即可。当MVC找到由AuthorizeAttribute修饰的控制器类时,它将调用AuthorizeAttribute.OnAuthorization()方法来执行授权。此外,当您指定全局过滤器时,您将属性类本身添加到过滤器列表中,这可能有点令人困惑,但这就是它的工作原理:
void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new AuthorizeAttribute());
}
答案 2 :(得分:4)
属性是.NET的一个特性,MVC过滤器是使用该功能实现的。
例如,System.Web.Mvc.HandleErrorAttribute来自BCL System.Attribute。过滤器通过钩子将行为应用到MVC管道中(粗略地说)。