엔터프라이즈 수준의 응용 프로그램에서는 모든 것을 (거의) 거의 구성 할 수 있어야합니다.부분보기에 컨트롤러 사용
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를 부분에 전달하여 적절한 메뉴를 렌더링 할 수 있어야합니다. 부분보기 방법을 사용하여이 목표를 달성하는 방법을 알지 못합니다. 둘째,로드되는 메뉴에 보안을 적용하면 메뉴 항목이 반대 순서로 표시됩니다. 따라서 일부 유형의 컨트롤러를 사용하여 메뉴 및 레이아웃에 대한 데이터 논리를 수행함으로써이 문제를 해결해야합니다.
그래서 누구에게 어떤 방향으로 가야할까요? 메뉴 (동적 인)에 대한 부분 뷰를 사용하려는 시도가 좋지 않다고 생각하기 시작했습니다.
나는 그것을 가지고 있다고 생각한다 :'@ {Html.RenderAction ("UserMenuAction", "Menu", new {area = "Admin", id = 1}); }',하지만 지금은 문제가 있습니다. 컨트롤러의 페이지 및 페이지 영역을 기준으로 "활성"메뉴 항목을 선택했습니다. 이제, 메뉴는 항상 사용중인 컨트롤러 ('ViewContext.RouteData.Values [ "Controller"]. ToString()'및'ViewContext.RouteData.DataTokens [ "area"]')이므로 관리자 영역을 반환합니다. 어떤 제안? – Keith
글쎄 그 메뉴 항목을 선택하는 논리를 사용할 수 있다고 생각하지 않습니다. 선택한 메뉴의 상태를 세션에 추가하거나 ViewBag에 추가하고 활성 메뉴 항목을 표시하는 데 사용할 수 있습니다. 다른 좋은 방법이 있습니다. 특정 프로젝트가 어떻게 구성되어 있는가에 달려 있습니다. – Jags
Area, Controller 및 Action을 _Layout에서 UserMenuAction으로 전달 했으므로 훌륭하게 작동합니다! 올바른 방향으로 움직여 주셔서 감사합니다. – Keith