【问题标题】:MVC3: Grouping Action Filters or calling Action Filters from other action filtersMVC3:分组动作过滤器或从其他动作过滤器调用动作过滤器
【发布时间】:2012-12-12 16:22:24
【问题描述】:

我正在尝试编写一个属性类,该类可用于我的所有“管理员”操作,然后有效地将所有相关操作/身份验证过滤器应用于该操作。例如,我总是应用AuthoriseAttribute 和自定义AdminLayoutAttribute,所以我的意图是只使用AdminAttribute,这在某种程度上暗示了上述两者。这样我就可以在一个方便的地方对整个管理部分进行更改。

但是我不知道我该怎么做。谁能指出我正确的方向?

非常感谢。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 action-filter actionfilterattribute


    【解决方案1】:

    您可以考虑将它们从操作移至控制器类或用于管理操作的基本控制器类。这样,您只需在控制器类中设置 AuthorizeAdminLayout 属性,而不是每个单独的操作方法。

    [Authorize]
    [AdminLayout]
    public AdminController: Controller
    {
        //action methods
    }
    

    拥有一个结合授权和一些自定义布局逻辑的属性可能被视为对单一责任原则的破坏,但如果您别无选择,那么您可以尝试以下方法:

    如果您想用新的AdminAttribute 替换现有的AdminLayoutAttribute,则可以创建AdminAttribute,以便它继承自标准AuthorizeAttribute,并在您的自定义AdminLayoutAttribute 中实现IActionFilter\IResultFilter。

    public class AdminLayoutAttribute: AuthorizeAttribute, IActionFilter, IResultFilter
    {
        //Logic as in existing AdminLayoutAttribute to be replaced
    }
    

    否则,如果您想保留现有的AdminLayoutAttribute 并添加一个新的AdminAttribute,将其与AuthorizeAttribute 结合,您可以从自定义属性继承并通过调用 AuthorizationFilter 类型的内部实例来实现 IAuthorizationFilter

    public class AdminLayoutAttribute: AdminLayoutAttribute, IAuthorizationFilter
    {
        //Implement IAuthorizationFilter by delegating to an internal AuthorizeFilter instance
        private _authorizeFilter = new AuthorizeAttribute();
    
        public override object TypeId 
        { 
            //override from base Attribute class as in AuthorizeAttribute class
            get { return _authorizeFilter.TypeId ; }
        }
    
        public string Roles 
        {
            get { return _authorizeFilter.Roles; }
            set { _authorizeFilter.Roles = value; }
        }
    
        public string Users 
        {
            get { return _authorizeFilter.Users; }
            set { _authorizeFilter.Users = value; }
        }
    
        public void OnAuthorization(AuthorizationContext filterContext) 
        {
            _authorizeFilter.OnAuthorization(filterContext);
        }
    
    }
    

    这两个选项的关键是不让新的 AdminAttribute 类继承自 2 个具体类,因为 C# 不支持多重继承。

    【讨论】:

    • 谢谢丹尼尔,我会试一试的。
    猜你喜欢
    • 2014-12-09
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多