如何在嵌套母版asp.net mvc 4中基于角色制作动态菜单?

时间:2013-06-29 18:30:20

标签: c# asp.net-mvc-4 sql-server-2008-express

我想问一下基于主页asp.net mvc 4中的角色的动态菜单。在我问之前。我在sql server express 2008中有这样的数据库菜单:

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>&copy; <%: 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>

你能帮帮我..如果我以管理员身份登录,或者以成功登录为角色后以用户身份登录,如何在嵌套母版页中创建动态菜单加载?

谢谢你的帮助..

2 个答案:

答案 0 :(得分:4)

首先,您不希望在母版页中执行此逻辑。您希望创建一个部分视图,该视图将根据某个控制器中子操作返回的模型信息构建菜单。例如:

您应该将此逻辑移动到负责构建导航的控制器中。在此控制器内部,您应声明一个返回所需信息的子操作。

如果您计划在数据库中存储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>
}

在您的母版页中,您想要使用您要调用的菜单:

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

无论您是否在数据库中存储用户访问权限,都应该了解如何继续。

更新:对不起,我后来意识到您使用的是ASPX View Engine,而不是Razor。您需要将我的标记转换为ASPX View Engine。

答案 1 :(得分:0)

尝试创建一个控制器,在其中使用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;
    }