2013-06-29 1 views
1

마스터 페이지에서 역할에 따라 동적 메뉴에 대해 질문하고 싶습니다. asp.net mvc 4. 전에 물어보십시오.중첩 된 마스터 페이지에서 역할을 기반으로 동적 메뉴를 만드는 방법 asp.net mvc 4?

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> 

이 같은 내가 만든 중첩 된 마스터 페이지 : 저는 SQL 서버 데이터베이스 메뉴는 다음과 같이 2008 년 표현이

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

당신은 나를 도울 수 있습니까? 성공으로 로그인 한 후에 관리자 또는 사용자로 로그인하면 중첩 된 마스터 페이지에서 동적 메뉴로드를 만드는 방법은 무엇입니까?

모두의

답변

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으로 변환해야합니다.

+0

죄송합니다, asp.에서 새로 왔습니다. net mvc. 역할에 기반한 동적 메뉴 실행을 어디에서 설명 할 수 있습니까? – Greditasari

+0

답변을 참조하십시오. 귀하의 코드에서 부분을 업데이 트하고 마크 업을 추가했습니다 (마지막 예) –

+0

Husein Roncevic. 고맙습니다. 다시 시도 할 것입니다 :) – Greditasari

0

ID를 사용하여 현재 사용자의 역할에 대한 IList를 가져온 컨트롤러를 작성한 다음 해당 목록을 쉼표로 구분 된 문자열로 변환 한 다음 사용자 환경 설정에 따라 뷰백 또는 tempdata에 저장하십시오. 해당 역할을 기반으로하는 항목을 표시하는 데이터를 표시합니다. 이것은 컨트롤러입니다

 [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; 
    }