C# 如何在嵌套母版页asp.net mvc 4中制作基于角色的动态菜单?
我想问一下基于母版页asp.NETMVC4中角色的动态菜单。在我问之前。sql server express 2008中的数据库菜单如下所示:C# 如何在嵌套母版页asp.net mvc 4中制作基于角色的动态菜单?,c#,asp.net-mvc-4,sql-server-2008-express,C#,Asp.net Mvc 4,Sql Server 2008 Express,我想问一下基于母版页asp.NETMVC4中角色的动态菜单。在我问之前。sql server express 2008中的数据库菜单如下所示: Id_Menu int NotNull Displaymenu varchar(50) Null Url varchar(50) Null ParentID int Not Null 我在mvc 4中创建了母版页,如下所示: <body>
Id_Menu int NotNull
Displaymenu varchar(50) Null
Url varchar(50) Null
ParentID int Not Null
我在mvc 4中创建了母版页,如下所示:
<body>
<header>
<div class="float-left">
<img src="../../Images/logo.png" width="350" height="95" />
</div>
<div class="content-wrapper">
<div class="float-right">
<section id="login">
<%: Html.Partial("_LoginPartial") %>
</section>
<nav>
<ul id="menu">
<li><%: Html.ActionLink("Home", "Index", "Home") %></li>
<li><%: Html.ActionLink("About", "About", "Home") %></li>
<li><%: Html.ActionLink("Contact", "Contact", "Home") %></li>
</ul>
</nav>
</div>
</div>
</header>
<div id="body">
<asp:ContentPlaceHolder ID="FeaturedContent" runat="server" />
<section class="content-wrapper main-content clear-fix">
<asp:ContentPlaceHolder ID="MainContent" runat="server" />
</section>
</div>
<footer>
<div class="content-wrapper">
<div class="float-left">
<p>© <%: DateTime.Now.Year %> - Cenie.Sistem Informasi.IT
Telkom</p>
</div>
</div>
</footer>
<%@ Master Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
AutoEventWireup="true" CodeBehind="Dashboard.master.cs"
Inherits="TA_SID.Views.Shared.Dashboard<TA_SID.Models>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="FeaturedContent" runat="server">
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="MainContent" runat="server">
<div class="span3 main-menu-span">
<div class="well nav-collapse sidebar-nav">
<ul class="nav nav-tabs nav-stacked main-menu">
<li class="nav-header hidden-tablet">MAIN
MENU</li>
if()
<li><a class="ajax-link"
href="/Admin/Index"><i class="icon-home"></i><span class="hidden-tablet">
Dashboard</span>
</a></li>
<li><a class="ajax-link"
href="/Admin/PertaminaIndex"><i class="icon-eye-open"></i><span class="hidden-tablet">
Pertamina</span></a></li>
<li><a class="ajax-link"
href="/Admin/DistributorIndex"><i class="icon-edit"></i><span class="hidden-tablet">
Distributor</span></a></li>
<li><a class="ajax-link"
href="/Admin/CustomerIndex"><i class="icon-list-alt"></i><span class="hidden-tablet">
Customer</span></a></li>
<li><a class="ajax-link"
href="/Admin/ProdukIndex"><i class="icon-font"></i><span class="hidden-tablet">
Product</span></a></li>
<li><a class="ajax-link" href="table.html">
<i class="icon-align-justify"></i><span class="hidden-tablet"> Chart</span></a></li>
<li><a class="ajax-link"
href="calendar.html"><i class="icon-calendar"></i><span class="hidden-tablet">
Calendar</span></a></li>
<li><a class="ajax-link" href="grid.html"><i
class="icon-th"></i><span class="hidden-tablet"> User</span></a></li>
</ul>
</div><!--/.well -->
</div>
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="ScriptsSection" runat="server">
</asp:Content>
你能帮我吗。。如果我以管理员或用户身份登录,在成功以角色身份登录后,如何在嵌套母版页中创建动态菜单加载
感谢您的帮助。首先,您不希望在母版页中执行此逻辑。您希望创建一个局部视图,该视图将基于某个控制器中的子操作返回的模型信息构建菜单。例如:
public class NavigationController : Controller
{
[ChildActionOnly]
public PartialViewResult GetMenuForUser()
{
var model = _securityLayer.GetUrlForUser(HttpContext.User.Identity.Name);
return PartialView("_UserMenu", model);
}
}
您应该将此逻辑移到负责构建导航的某个控制器中。在此控制器内,您应该声明一个子操作,该操作返回您所需的信息
如果您计划在数据库中存储URL和描述,那么还可以在表中存储访问权限。这样,您可以传递用户的组或用户名,并检索该用户有权访问的URL集合。之后,您可以使用类似于下面的代码
例如:
public class NavigationController : Controller
{
[ChildActionOnly]
public PartialViewResult GetMenuForUser()
{
var model = _securityLayer.GetUrlForUser(HttpContext.User.Identity.Name);
return PartialView("_UserMenu", model);
}
}
您的_UserMenu.cshtml可能类似于:
@model IEnumerable<SomeCollection>
@foreach(var url in Model) {
<li><a class="ajax-link" href="@url.Url">@url.Description</a></li>
}
@model IEnumerable
@foreach(模型中的var url){
}
然后在母版页中,您要使用的菜单将调用:
<div class="well nav-collapse sidebar-nav">
<ul class="nav nav-tabs nav-stacked main-menu">
<li class="nav-header hidden-tablet">MAIN MENU</li>
@{ Html.RenderAction("GetMenuForUser", "Navigation"); }
</ul>
</div>
主菜单
@{Html.RenderAction(“GetMenuForUser”,“Navigation”);}
无论您是否在数据库中存储用户访问权限,这都应该让您了解如何继续
更新:抱歉,我后来意识到您使用的是ASPX视图引擎,而不是Razor。您需要将我的标记转换为ASPX视图引擎 首先,您不希望在母版页中执行此逻辑。您希望创建一个局部视图,该视图将基于某个控制器中的子操作返回的模型信息构建菜单。例如:
public class NavigationController : Controller
{
[ChildActionOnly]
public PartialViewResult GetMenuForUser()
{
var model = _securityLayer.GetUrlForUser(HttpContext.User.Identity.Name);
return PartialView("_UserMenu", model);
}
}
您应该将此逻辑移到负责构建导航的某个控制器中。在此控制器内,您应该声明一个子操作,该操作返回您所需的信息
如果您计划在数据库中存储URL和描述,那么还可以在表中存储访问权限。这样,您可以传递用户的组或用户名,并检索该用户有权访问的URL集合。之后,您可以使用类似于下面的代码
例如:
public class NavigationController : Controller
{
[ChildActionOnly]
public PartialViewResult GetMenuForUser()
{
var model = _securityLayer.GetUrlForUser(HttpContext.User.Identity.Name);
return PartialView("_UserMenu", model);
}
}
您的_UserMenu.cshtml可能类似于:
@model IEnumerable<SomeCollection>
@foreach(var url in Model) {
<li><a class="ajax-link" href="@url.Url">@url.Description</a></li>
}
@model IEnumerable
@foreach(模型中的var url){
}
然后在母版页中,您要使用的菜单将调用:
<div class="well nav-collapse sidebar-nav">
<ul class="nav nav-tabs nav-stacked main-menu">
<li class="nav-header hidden-tablet">MAIN MENU</li>
@{ Html.RenderAction("GetMenuForUser", "Navigation"); }
</ul>
</div>
主菜单
@{Html.RenderAction(“GetMenuForUser”,“Navigation”);}
无论您是否在数据库中存储用户访问权限,这都应该让您了解如何继续
更新:抱歉,我后来意识到您使用的是ASPX视图引擎,而不是Razor。您需要将我的标记转换为ASPX视图引擎 尝试创建一个控制器,使用identity获取当前用户角色的IList,然后将该列表转换为以逗号分隔的字符串,然后根据您的首选项将其存储在viewbag或tempdata中,然后在布局中使用viewbag数据根据在其中找到的角色显示项目。这是控制器
[Authorize]
public ActionResult Index()
{
if (User.Identity.IsAuthenticated)
{
var user = User.Identity;
ViewBag.Name = user.Name;
ViewBag.DisplayMenu = UserRole();
return View();
}
else
{
ViewBag.Name = "Not Logged in";
}
return View();
}
public string UserRole()
{
string urole = "non";
if (User.Identity.IsAuthenticated)
{
var user = User.Identity;
ApplicationDbContext context = new ApplicationDbContext();
var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
var s = UserManager.GetRoles(user.GetUserId());
urole = String.Join(",", s.ToArray());
}
return urole;
}
[授权]
公共行动结果索引()
{
if(User.Identity.IsAuthenticated)
{
var user=user.Identity;
ViewBag.Name=user.Name;
ViewBag.DisplayMenu=UserRole();
返回视图();
}
其他的
{
ViewBag.Name=“未登录”;
}
返回视图();
}
公共字符串UserRole()
{
字符串urole=“非”;
if(User.Identity.IsAuthenticated)
{
var user=user.Identity;
ApplicationDbContext上下文=新的ApplicationDbContext();
var UserManager=newusermanager(newuserstore(context));
var s=UserManager.GetRoles(user.GetUserId());
urole=String.Join(“,”,s.ToArray());
}
回尿;
}
尝试创建一个控制器,在其中使用identity获取当前用户角色的IList,然后将该列表转换为以逗号分隔的字符串,然后根据您的偏好将其存储在viewbag或tempdata中,然后在布局中使用viewbag数据根据在其中找到的角色显示项目。这是控制器
[Authorize]
public ActionResult Index()
{
if (User.Identity.IsAuthenticated)
{
var user = User.Identity;
ViewBag.Name = user.Name;
ViewBag.DisplayMenu = UserRole();
return View();
}
else
{
ViewBag.Name = "Not Logged in";
}
return View();
}
public string UserRole()
{
string urole = "non";
if (User.Identity.IsAuthenticated)
{
var user = User.Identity;
ApplicationDbContext context = new ApplicationDbContext();
var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
var s = UserManager.GetRoles(user.GetUserId());
urole = String.Join(",", s.ToArray());
}
return urole;
}
[授权]
公共行动结果索引()
{
if(User.Identity.IsAuthenticated)
{
var user=user.Identity;
ViewBag.Name=user.Name;
ViewBag.DisplayMenu=UserRole();
返回视图();
}
其他的
{
ViewBag.Name=“未登录”;
}
返回视图();
}
公共字符串UserRole()
{
字符串urole=“非”;
if(User.Identity.IsAuthenticated)
{
var user=user.Identity;