加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – MVC4 Bootstrap示例中基于角色的导航显示

发布时间:2020-12-16 07:00:42 所属栏目:asp.Net 来源:网络整理
导读:您如何根据Bootstrap示例项目中的角色有条件地显示菜单项?我正在考虑做以下事情 实现INavigatonRouteFilter – 实际上只是实现了shouldRemove(Route navigationRoutes)方法 – 通过获取路由的默认控制器/操作并查看用户是否被授权 在App_Start中配置Navigat
您如何根据Bootstrap示例项目中的角色有条件地显示菜单项?我正在考虑做以下事情

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

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

>我实际上并不知道如何执行第一步,除非我添加了一堆条件语句来明确检查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;
    }
}

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读