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 回答