0

엔터프라이즈 수준의 응용 프로그램에서는 모든 것을 (거의) 거의 구성 할 수 있어야합니다.부분보기에 컨트롤러 사용

public class Menu 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public virtual ICollection<MenuItem> MenuItems { get; set; } 
} 

public class MenuItem 
{ 
    [Key] 
    public int ID { get; set; } 
    public int? MenuID { get; set; } 
    public int? ParentMenuItemID { get; set; } 
    public virtual IdentityRole Role { get; set; } 
    public string Name { get; set; } 
    public string Area { get; set; } 
    public string Controller { get; set; } 
    public string Action { get; set; } 
    public string Url { get; set; } 
    public string CssClass { get; set; } 
    public string Icon { get; set; } 
    public virtual ICollection<MenuItem> MenuItems { get; set; } 
    public virtual Menu Menu { get; set; } 
} 

내가 그들에게있을 것입니다 부분보기의 특정 메뉴를 렌더링 할 수있는 기능을 제공하기 위해 노력하고있어 : 내가 관리자가 여러 메뉴를 만들 수있게 해주는 메뉴 및 메뉴 항목 모델을 만든 이유 레이아웃 뷰에서 렌더링 및 보안 적용 :

<ul> 
    <li> 
     <div class="sidebar-toggler hidden-phone"></div> 
    </li> 
    <li> 
     <form class="sidebar-search"> 
      <div class="input-box"> 
       <a href="javascript:;" class="remove"></a> 
       <input type="text" placeholder="Search..." /> 
       <input type="button" class="submit" value=" " /> 
      </div> 
     </form> 
    </li> 
    @foreach (var m in Model.MenuItems) 
    { 
     if (m.Role == null || User.IsInRole(m.Role.Name)) 
     { 
      <li class="@(m.MenuItems != null && m.MenuItems.Count > 0 ? "has-sub " : "") @(ViewContext.RouteData.Values["Controller"].ToString() == m.Controller || (ViewContext.RouteData.DataTokens["area"] != null && ViewContext.RouteData.DataTokens["area"].ToString() == m.Area) ? "active " : " ") "> 
       <a href="@Url.Action(m.Action, m.Controller, new { area = (string.IsNullOrEmpty(m.Area) ? "" : m.Area) }, null)"> 
        @if (!string.IsNullOrEmpty(m.Icon)) 
        { 
         <i class="@m.Icon"></i> 
        } 
        <span class="title">@m.Name</span> 
        @if (ViewContext.RouteData.Values["Controller"].ToString() == m.Controller || (ViewContext.RouteData.DataTokens["area"] != null && ViewContext.RouteData.DataTokens["area"].ToString() == m.Area)) 
        { 
         <span class="selected"></span> 
        } 
       </a> 
       @if (m.MenuItems != null && m.MenuItems.Count > 0) 
       { 
        <ul class="sub"> 
         @foreach (var mi in m.MenuItems) 
         { 
          if (mi.Role == null || User.IsInRole(mi.Role.Name)) 
          { 
           <li class="@(ViewBag.Title == mi.Name ? "active" : "")"> 
            <a href="@Url.Action(mi.Action, mi.Controller, new { area = mi.Area })">@mi.Name</a> 
           </li> 
          } 
         } 
        </ul> 
       } 
      </li> 
     } 
    } 
</ul> 

내 현재 코드를 테스트하기 위해, 나는 레이아웃보기에서 메뉴 ID를 하드 코딩 : 이제

<div class="page-container row-fluid"> 
    <div class="page-sidebar nav-collapse collapse"> 
     @Html.Partial("_LeftMenu", new MyAppContext().Menus.Find(1)) 
    </div> 
    <div class="page-content"> 
     @RenderBody() 
    </div> 
</div> 

, 문제의 몇 가지 작물을 먼저 메뉴 ID를 부분에 전달하여 적절한 메뉴를 렌더링 할 수 있어야합니다. 부분보기 방법을 사용하여이 목표를 달성하는 방법을 알지 못합니다. 둘째,로드되는 메뉴에 보안을 적용하면 메뉴 항목이 반대 순서로 표시됩니다. 따라서 일부 유형의 컨트롤러를 사용하여 메뉴 및 레이아웃에 대한 데이터 논리를 수행함으로써이 문제를 해결해야합니다.

그래서 누구에게 어떤 방향으로 가야할까요? 메뉴 (동적 인)에 대한 부분 뷰를 사용하려는 시도가 좋지 않다고 생각하기 시작했습니다.

답변

1

@ Html.Partial을 직접 호출하는 대신 @Html.Partial 메서드 대신 @Html.RenderAction을 사용하여 작업 메서드가있는 컨트롤러를 만들 수 있습니다. 액션 메소드에서 ID를 전달하고 필요한 보안 로직을 적용 할 수 있으며 뷰에서 메뉴 컬렉션을 반복하고 필요한 메뉴를 표시합니다. 이렇게하면 UI도 깨끗하게 유지됩니다.

+0

나는 그것을 가지고 있다고 생각한다 :'@ {Html.RenderAction ("UserMenuAction", "Menu", new {area = "Admin", id = 1}); }',하지만 지금은 문제가 있습니다. 컨트롤러의 페이지 및 페이지 영역을 기준으로 "활성"메뉴 항목을 선택했습니다. 이제, 메뉴는 항상 사용중인 컨트롤러 ('ViewContext.RouteData.Values ​​[ "Controller"]. ToString()'및'ViewContext.RouteData.DataTokens [ "area"]')이므로 관리자 영역을 반환합니다. 어떤 제안? – Keith

+0

글쎄 그 메뉴 항목을 선택하는 논리를 사용할 수 있다고 생각하지 않습니다. 선택한 메뉴의 상태를 세션에 추가하거나 ViewBag에 추가하고 활성 메뉴 항목을 표시하는 데 사용할 수 있습니다. 다른 좋은 방법이 있습니다. 특정 프로젝트가 어떻게 구성되어 있는가에 달려 있습니다. – Jags

+0

Area, Controller 및 Action을 _Layout에서 UserMenuAction으로 전달 했으므로 훌륭하게 작동합니다! 올바른 방향으로 움직여 주셔서 감사합니다. – Keith