MVC4 Bootstrap示例中基于角色的导航显示

时间:2013-06-01 21:56:14

标签: asp.net-mvc asp.net-mvc-4 twitter-bootstrap system.web.routing

您应该如何基于Bootstrap示例项目中的角色有条件地显示菜单项?我在考虑做以下事情

  1. 实施INavigatonRouteFilter - 实际上只是实施shouldRemove(Route navigationRoutes)方法 - 获取路线的默认控制器/操作并查看用户是否获得授权
  2. NavigationRoutes.Filters.Add(myAuthorizationFilter)
  3. 中配置NavigationRoutes后致电App_Start

    我用这种方法看到了两个问题:

    1. 除非我添加一堆条件语句以明确检查Controller的名称,否则我实际上并不知道如何执行第一步
    2. 一旦有很多过滤器或者希望以后有更多的模块化,这似乎会让NavigationRoutes.Filters很难处理
    3. 我不知道我已经清楚地解释了这个问题,但基本上我想使用Bootstrap示例中提供的内容来实现基于授权的导航菜单显示(如果可能的话)。使用INavigationRouteFilter似乎是最自然的方式。

1 个答案:

答案 0 :(得分:5)

对于那些寻找答案或至少是快速修复的人。 这是我在5分钟后得出的结果,而且我肯定没有关于这可能产生的任何副作用。

routes.MapNavigationRoute<HomeController>("Index", c => c.Index())
            .FilterRoute(() => !WebSecurity.IsAuthenticated);

您可以在调用FilterRoute()时进行所有过滤,也可以添加更多扩展方法以节省一些字符。

我在考虑.RequireRole(“Adiministrators”);它依次调用WebSecurity.RequireRoles()(或HttpContext.Current.User.IsInRole())等。

public static NavigationRouteBuilder FilterRoute(this NavigationRouteBuilder builder, Func<bool> func)
    {
        var currentRoute = builder._parent;

        NavigationRoutes.Filters.Add(new BootstrapAuthorizationFilter(builder, x => 
        {
            if (x == currentRoute)
                return func();
            else
                return false;
        }));

        return builder;
    }

和BootstrapAuthorizationFilter只是一个实现INavigationRouteFilter的类,它在ShouldRemove()方法中调用func()

public class BootstrapAuthorizationFilter : INavigationRouteFilter
{
    private NavigationRouteBuilder builder;
    private Func<NamedRoute, bool> func;

    public BootstrapAuthorizationFilter(NavigationRouteBuilder builder, Func<NamedRoute, bool> func)
    {
        this.builder = builder;
        this.func = func;
    }

    public bool ShouldRemove(Route navigationRoutes)
    {
        if (navigationRoutes is NamedRoute)
            return func(navigationRoutes as NamedRoute);

        return false;
    }
}

显然没什么特别的,我不确定我是否会在生产中使用它。 但我觉得很简单并且有效(对于我测试过的情况)。 话虽如此,我希望新的路由功能即将发布:)