我正在尝试使用Jquery在我的MVC应用程序中创建导航菜单。我正在使用http://users.tpg.com.au/j_birch/plugins/superfish/。
但是我想显示基于用户角色的菜单项,即包括asp成员资格授权逻辑,这样如果用户没有所需的角色,他就不会看到某些菜单项。
任何人都可以建议如何继续。
由于
答案 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>
干杯, 迪安