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

  • 实现INavigatonRouteFilter-实际上只是实现shouldRemove(Route navigationRoutes)方法-通过获取路由的默认 Controller /操作并查看用户是否获得了
  • 的授权
  • NavigationRoutes.Filters.Add(myAuthorizationFilter)中配置NavigationRoutes后调用App_Start

  • 我看到这种方法有两个问题:
  • 我实际上并不知道如何执行第一步,除非我添加一堆条件语句来明确检查Controller的名称
  • 一旦在
  • 上有很多过滤器或对更高模块化的需求,这似乎会使NavigationRoutes.Filters很难处理

    我不知道我已经足够清楚地解释了这个问题,但是基本上,我想尽可能使用Bootstrap示例中提供的内容来实现基于授权的导航菜单显示。使用INavigationRouteFilter似乎是最自然的方法。

    最佳答案

    对于那些寻找答案或至少是快速解决方案的人。
    这是我在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;
        }
    }
    

    显然没有花哨,我不确定是否要在生产中使用它。
    但是我认为这很简单,并且可以工作(适用于我测试过的情况)。
    话虽如此,我希望新的路由功能将很快发布:)

    10-06 07:54