5

Bootstrap サンプル プロジェクトで、ロールに基づいて条件付きでメニュー項目を表示するにはどうすればよいでしょうか? 私は次のことを考えていました

  1. 実装INavigatonRouteFilter- 実際にはshouldRemove(Route navigationRoutes)メソッドを実装するだけです - ルートのデフォルトのコントローラー/アクションを取得し、ユーザーが承認されているかどうかを確認します
  2. NavigationRoutes.Filters.Add(myAuthorizationFilter)を設定した後NavigationRoutesに呼び出すApp_Start

このアプローチには 2 つの問題があります。

  1. Controllerの名前を明示的にチェックするための一連の条件ステートメントを追加しない限り、最初のステップを実行する方法が実際にはわかりません
  2. これはNavigationRoutes.Filters、後で多くのフィルターやより多くのモジュール性が必要になると、対処が非常に難しくなる可能性があるようです。

問題点を十分に説明できているかわかりませんが、基本的には Bootstrap サンプルで提供されているものを使用して、認可ベースのナビゲーション メニュー表示を実装したいと考えています。を使用INavigationRouteFilterするのが最も自然な方法のように思えました。

4

1 に答える 1

5

答えまたは少なくとも簡単な修正を探している人向け。これが5分後に私が思いついたものであり、これが持つ可能性のある副作用についてはほとんど考えていません.

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

FilterRoute() への呼び出しですべてのフィルタリングを行うか、さらに拡張メソッドを追加して文字数を節約することができます。

私は .RequireRole("管理者"); を考えています。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 は、その ShouldRemove() メソッドで func() を呼び出す INavigationRouteFilter を実装する単なるクラスです。

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;
    }
}

明らかに空想的なものはなく、本番環境で使用するかどうかはわかりません. しかし、私は十分にシンプルで機能すると思います(私がテストした場合)。そうは言っても、新しいルーティング機能がすぐにリリースされることを願っています:)

于 2013-06-22T18:06:32.030 に答える