【问题标题】:What is the difference between attributes and filters in MVCMVC中的属性和过滤器有什么区别
【发布时间】:2013-09-01 17:43:46
【问题描述】:

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

例子:

SomeClassAttribute (or ISomeClassAttribute)

VS

SomeClassFilter (or ISomeClassFilter)

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

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-4 asp.net-web-api action-filter


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        你已经在那个句子中得到了它。 过滤器和属性不是完全可比的概念,它们有两种不同的功能。

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

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

        【讨论】:

        • 我可以说 MVC 过滤器是一个特殊属性吗?
        猜你喜欢
        • 1970-01-01
        • 2019-05-01
        • 2019-02-11
        • 2015-04-18
        • 2015-11-15
        • 2016-04-29
        相关资源
        最近更新 更多