JQuery导航菜单授权

时间:2012-07-19 12:52:20

标签: jquery asp.net-mvc-3

我正在尝试使用Jquery在我的MVC应用程序中创建导航菜单。我正在使用http://users.tpg.com.au/j_birch/plugins/superfish/

但是我想显示基于用户角色的菜单项,即包括asp成员资格授权逻辑,这样如果用户没有所需的角色,他就不会看到某些菜单项。

任何人都可以建议如何继续。

由于

3 个答案:

答案 0 :(得分:2)

由于superfish仅适用于客户端,因此您需要确保它首先只有正确的html,您可以在服务器端定义。

您的角色提供程序具有IsUserInRole和GetRolesForUser。您可以使用它来构建HTML。

例如:

@if (RoleProvider.IsUserInRole(user.username, "admin")) {
    <li>Admin<li>
}

答案 1 :(得分:1)

如果您在数据库中设置了用户/角色,那么您可以创建表格,一个表格将包含菜单,另一个表格将使用角色映射菜单。

您可能必须创建一个子操作,该操作将查询数据库获取特定角色的菜单项,并通过局部视图呈现菜单。您甚至可以在会话中保留用户的菜单项,这样您就可以避免在每次请求时点击数据库。

隐藏菜单项可以部分解决问题。您必须使用“授权”过滤器来保护控制器和操作。

答案 2 :(得分:1)

更新:如果您正在进行大量客户端工作并仅与数据进行MVC应用程序通信,则此答案更合适。如果您从服务器渲染每个页面,那么请使用Steve的答案。

我认为您需要使用返回JsonResult的控制器操作将用户的角色传达给客户端。 E.g。

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

然后使用$.ajax检索数据客户端,并在回调中从DOM中删除与您的要求不匹配的节点。 E.g。

  

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

干杯, 迪安