0

Jquery を使用して MVC アプリケーションでナビゲーション メニューを作成しようとしています。これにはhttp://users.tpg.com.au/j_birch/plugins/superfish/を使用しています。

ただし、ユーザーの役割に基づいてメニュー項目を表示したい、つまり、ユーザーが必要な役割を持っていない場合に特定のメニュー項目が表示されないように、ASP メンバーシップ承認ロジックを含めたいと考えています。

誰でも続行方法を提案できますか。

ありがとう

4

3 に答える 3

2

superfishはクライアント側でのみ機能するため、サーバー側で定義する正しいhtmlのみが最初に含まれていることを確認する必要があります。

ロールプロバイダーには、IsUserInRoleとGetRolesForUserがあります。これを使用してHTMLを構築できます。

例えば:

@if (RoleProvider.IsUserInRole(user.username, "admin")) {
    <li>Admin<li>
}
于 2012-07-19T13:12:54.743 に答える
2

更新:この回答は、クライアント側で多くのことを行っていて、データのみを目的として MVC アプリケーションと通信している場合に適しています。サーバーからすべてのページをレンダリングしている場合は、Steve からの回答を使用してください。

JsonResult を返すコントローラー アクションを使用して、ユーザーの役割をクライアント側に伝える必要があると思います。例えば

public class SecurityController : Controller
{
    public ActionResult Roles()
    {
        return new JsonResult
        {
            Data = System.Web.Security.Roles.GetRolesForUser(),
            JsonRequestBehavior = JsonRequestBehavior.AllowGet
        };
    }
}

次に$.ajax、クライアント側でデータを取得するために使用し、コールバックで、要件に一致しない DOM からノードを削除します。例えば

    <ul id="menu">
        <li data-roles="Administrator">
            Secured
        </li>
        <li>Any</li>
    </ul>
    <script type="text/javascript">
        $.ajax({
            url: "security/roles",
            success: function(roles) {
                $("#menu li[data-roles]").filter(function() {
                    var requiredRoles = (this.attr("data-roles") || "").split(",");
                    for (var requiredRole in requiredRoles) {
                        if (roles.indexOf(requiredRole) >= 0) {
                            return false;
                        }
                    }

                    return true;
                }).remove();

                // TODO call your menu plugin here
                // $("#menu").superfish();
            },
            error: function () {
                $("#menu li[data-roles]").remove();
            }
        });
    </script>

乾杯、ディーン

于 2012-07-19T13:29:27.800 に答える
1

データベースにユーザー/ロールを設定している場合は、テーブルを作成できます。一方のテーブルにはメニューが含まれ、もう一方のテーブルにはメニューがロールにマップされます。

データベースにクエリを実行して特定のロールのメニュー項目を取得し、部分ビューでメニューをレンダリングする子アクションを作成する必要がある場合があります。ユーザーのメニュー項目をセッション中に保持することもできます。これにより、各リクエストでデータベースにアクセスすることを回避できます。

メニュー項目を非表示にすると、問題が部分的に解決されます。コントローラとアクションを保護するには、承認フィルタを使用する必要があります。

于 2012-07-19T13:22:41.283 に答える