2013-05-12 2 views
2

다중 레벨 동적 메뉴를 반복하려고합니다. 부모가 자식 Menus을 표시하고 싶을 때마다 수동으로이 작업을 수행 할 수있게되었습니다. 수동으로 반복해야합니다. 이 동적 메뉴를 통해 다중 레벨을 반복하는 최상의 방법이나 대안을 알고 싶습니다. 여기까지 제가 한 것입니다.Asp.Net MVC의 다중 레벨 동적 메뉴를 통한 루프

@{ var menusList = ViewBag.Menus as IEnumerable<ParentMenuViewModel>; } 
@foreach (var parentMenu in menusList.Where(p => p.ParentId == 0)) 
{ 
    <ul> 
     <li> 
      <h1>@parentMenu.Name</h1> 
      @if (menusList.Count(p => p.ParentId == parentMenu.MenuId) > 0) 
      { 
       <ul> 
        @foreach (var childMenu in menusList.Where(p => p.ParentId == parentMenu.MenuId)) 
        { 
         <h2>@childMenu.Name</h2> 
         if (menusList.Count(p => p.ParentId == childMenu.MenuId) > 0) 
         { 
          foreach (var subChild in menusList.Where(p => p.ParentId == childMenu.MenuId)) 
          { 
           <h3>@subChild.Name</h3> 
          } 
         } 
        } 
       </ul> 
      } 
     </li> 
    </ul> 

} 

UPDATE : 출력은 다음과 같다;

HOME 
SUB MENU1 
    SUB SUB MENU1 
    SUB SUB MENU2 

그러나,이 같은 내 데이터베이스 뭔가있다;

HOME 
SUB MENU1 
    SUB SUB MENU1 
    SUB SUB MENU2 
    Sub SUB SUB MENU1 
    Sub SUB SUB MENU2 

여기 내 모델입니다.
enter image description here

답변

5

당신은 partialview을 사용하고 재귀 루프를 할 수 있습니다.

public ActionResult Menus(){ 
    List<Menu> menusource; // get your menus here 
    ViewBag.Menus = CreateVM(0, menusource); // transform it into the ViewModel 
    return View(); 
} 

public IEnumerable<MenuViewModel> CreateVM(int parentid, List<Menu> source) 
{ 
    return from men in source 
      where men.ParentId = parentid 
      select new MenuViewModel(){ 
         MenuId = men.MenuId, 
         Name = men.Name 
         // other properties 
         Children = CreateVM(men.MenuId, source) 
        }; 
} 
:

// The ViewModel is now a hirearchical model, where each item has a list of children. 
public class MenuViewModel 
{ 
    int MenuId {get; set;} 
    string Name {get; set;} 
    //other properties 
    ** snip ** 
    List<MenuViewModel> Children {get; set;} 
} 

컨트롤러

가 계층 뷰 모델로 모델을 변환

의 ViewModel : 당신이 먼저 모델을 약간 수정해야 할 거라고 그렇게하기 위해,

보기

@{ 
    var menusList = ViewBag.Menus as IEnumerable<MenuViewModel>; 
    Html.RenderPartial("MenuPartial", menuslist); 
} 

MenuPartial

@model IEnumerable<MenuViewModel> 

@foreach (var menuitem in model) 
{ 
    <ul> 
     <li> 
      <h1>@menuitem.Name</h1> 
      @{ 
       Html.RenderPartial("MenuPartial", menuitem.Children); 
      } 
     </li> 
    </ul> 
} 

당신이 당신의 원본 코드와 관련하여 여기에 누락 될 수있는 유일한 것은 당신이 다른 HX-태그가 없습니다,하지만 당신은 방법을 찾을 수 있다는 것입니다 그 주위에 또 다른 뷰 모델을 만들고 현재있는 수준으로 전달합니다.

참고 :이 코드를 모두 SO 편집기에 입력 했으므로 구문 오류가있을 수 있습니다.

+1

내 필요에 따라 수정하면 효과가 있습니다. 감사합니다 –

+0

당신은 그것을 asycronous (귀하의 코드)로 만들 수 있습니까? 나는 시도했지만 succed하지 않았다. 비동기 사용 및 키워드 기다림 –

관련 문제