您应该如何基于Bootstrap示例项目中的角色有条件地显示菜单项?我在考虑做以下事情
INavigatonRouteFilter
- 实际上只是实施shouldRemove(Route navigationRoutes)
方法 - 获取路线的默认控制器/操作并查看用户是否获得授权NavigationRoutes.Filters.Add(myAuthorizationFilter)
NavigationRoutes
后致电App_Start
醇>
我用这种方法看到了两个问题:
Controller
的名称,否则我实际上并不知道如何执行第一步NavigationRoutes.Filters
很难处理我不知道我已经清楚地解释了这个问题,但基本上我想使用Bootstrap示例中提供的内容来实现基于授权的导航菜单显示(如果可能的话)。使用INavigationRouteFilter
似乎是最自然的方式。
答案 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;
}
}
显然没什么特别的,我不确定我是否会在生产中使用它。 但我觉得很简单并且有效(对于我测试过的情况)。 话虽如此,我希望新的路由功能即将发布:)