您应该如何根据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;
}
}
显然没有花哨,我不确定是否要在生产中使用它。
但是我认为这很简单,并且可以工作(适用于我测试过的情况)。
话虽如此,我希望新的路由功能将很快发布:)