Dot*_*mer 2 c# asp.net asp.net-mvc loops asp.net-mvc-4
我试图循环多级动态菜单.我已成功手动执行此操作,即每次如果要显示Menus其父项的子项,我必须手动循环.我想知道通过这些动态菜单循环多级的最佳方式或替代方法
这是我到目前为止所做的事情;
@{ 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>
}
Run Code Online (Sandbox Code Playgroud)
更新:输出看起来像这样;
HOME
SUB MENU1
SUB SUB MENU1
SUB SUB MENU2
Run Code Online (Sandbox Code Playgroud)
但是,我在我的数据库中有这样的东西;
HOME
SUB MENU1
SUB SUB MENU1
SUB SUB MENU2
Sub SUB SUB MENU1
Sub SUB SUB MENU2
Run Code Online (Sandbox Code Playgroud)
这是我的模特;

您可以使用partialview然后执行递归循环.为了做到这一点,你首先需要改变你的模型:
视图模型
// 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;}
}
Run Code Online (Sandbox Code Playgroud)
调节器
将模型转换为分层ViewModel:
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)
};
}
Run Code Online (Sandbox Code Playgroud)
视图
@{
var menusList = ViewBag.Menus as IEnumerable<MenuViewModel>;
Html.RenderPartial("MenuPartial", menuslist);
}
Run Code Online (Sandbox Code Playgroud)
MenuPartial
@model IEnumerable<MenuViewModel>
@foreach (var menuitem in model)
{
<ul>
<li>
<h1>@menuitem.Name</h1>
@{
Html.RenderPartial("MenuPartial", menuitem.Children);
}
</li>
</ul>
}
Run Code Online (Sandbox Code Playgroud)
关于原始代码,这里唯一缺少的是你没有不同的Hx标签,但你可以通过创建另一个viewmodel并将其传递给你当前所在的级别来找到解决方法.
注意:我在SO编辑器中输入了所有这些代码,因此可能存在一些小的语法错误.
| 归档时间: |
|
| 查看次数: |
7897 次 |
| 最近记录: |