Asp.net mvc MVC3:对操作筛选器进行分组或从其他操作筛选器调用操作筛选器

Asp.net mvc MVC3:对操作筛选器进行分组或从其他操作筛选器调用操作筛选器,asp.net-mvc,asp.net-mvc-3,action-filter,actionfilterattribute,Asp.net Mvc,Asp.net Mvc 3,Action Filter,Actionfilterattribute,我正在尝试编写一个属性类,它可以用于我的所有“管理”操作,然后有效地将所有相关的操作/auth过滤器应用于该操作。例如,我总是应用authorizationAttribute和一个自定义的AdminLayoutAttribute,因此我的意图是只使用一个AdminAttribute,它以某种方式暗示了上述两种属性。这样我就可以在一个方便的地方对整个管理部分进行更改 然而,我不知道我怎么能做到这一点。有人能给我指出正确的方向吗 你可以考虑将它们从操作中移到控制器类或Acmin动作的基本控制器类中。

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

然而,我不知道我怎么能做到这一点。有人能给我指出正确的方向吗


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

[Authorize]
[AdminLayout]
public AdminController: Controller
{
    //action methods
}
拥有一个结合了授权和一些自定义布局逻辑的属性可能被视为打破了单一责任原则,但是如果您没有其他选择,那么您可以尝试以下方法:

如果要将现有的
AdminLayoutAttribute
替换为新的
AdminAttribute
,则可以创建
AdminAttribute
,使其继承标准的
AuthorizeAttribute
,并在自定义AdminLayoutAttribute中实现IActionFilter\IResultFilter

public class AdminLayoutAttribute: AuthorizeAttribute, IActionFilter, IResultFilter
{
    //Logic as in existing AdminLayoutAttribute to be replaced
}
否则,如果要保留现有的
AdminLayoutAttribute
并添加一个新的
AdminAttribute
,将其与
AuthorizationAttribute
组合,则可以从自定义属性继承,并通过调用AuthorizationFilter类型的内部实例来实现IAAuthorizationFilter

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#不支持多重继承

谢谢你,丹尼尔,我会试一试的。