MVC3:分组操作过滤器或从其他操作过滤器调用操作过滤器

时间:2012-12-12 16:22:24

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

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

但是我不明白我该怎么做。任何人都可以指出我正确的方向吗?

非常感谢。

1 个答案:

答案 0 :(得分:3)

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

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

具有组合授权和一些自定义布局逻辑的属性可以被视为单一责任原则的中断,但如果您没有其他选择,那么您可以尝试这些方法:

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

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

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

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);
    }

}

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