如何在ASP.NET MVC中的Layout或MasterPage中动态加载菜单项?

时间:2011-07-16 17:03:08

标签: asp.net-mvc

您好我想在_Layout.cshtml文件中动态加载meny项目。

我该怎么做?你能指点我做一个代码示例吗?还是什么?

我并不是在寻找任何特别奇特的方式。

下面我将描述我的意图:

我只想在屏幕左侧显示不同菜单项的列表。假设有一个以

形式的菜单项层次结构

分类 - >类型 - >品牌 - >模型。

所以最初只是一个类别菜单项呈现的列表,然后选择一个类别和一个类型菜单项呈现列表,一个选择一个类型和一个品牌菜单项呈现列表,一个选择一个品牌和一个列表模型菜单项呈现,如下所示:

(菜单的初始外观)

分类

  • 汽车
  • 自行车
  • 摩托车

(选择汽车)

类型:

  • 跑车
  • 卡车
  • 转换

(Coupe被选中)

品牌:

  • BMW
  • 沃尔沃
  • 福特
  • 梅赛德斯

(选择宝马)

型号:

  • 325i的
  • 的128i
  • 650i双
  • M6

2 个答案:

答案 0 :(得分:0)

我会在局部视图中执行此操作,并使用RenderPartial从布局页面调用它。在局部视图中,您可以将这些列为无序列表,如

<ul>
   <li>Categories
         <ul class='sub'>
            <li> Cars</li>
            <li> Boats</li>
            <li> Bikes</li>
         </ul>
   </li>
   <li>Types
         <ul class='sub'>
            <li>Coupes</li>
            <li>Trucks</li>
            <li>Van</li>
         </ul>
   </li>
   <li>Brands
         <ul class='sub'>
            <li> BMW</li>
            <li> Volwo</li>

         </ul>
   </li>
</ul> 

然后你可以写一些css来显示主ul作为菜单,并在悬停或点击时打开和关闭内部uls。此外,您可以创建一个html帮助器并传递包含所有这些菜单和菜单项的模型,它将为您生成菜单。 Morover,如果您对第三方开源解决方案感兴趣,可以查看Telerik Menu

答案 1 :(得分:-1)

如果您正在讨论特定于控制器或操作的项目,您可以在ViewData中放置一些操作,该操作将通过呈现菜单的任何视图读取。

编辑:一个工作示例

数据结构:一个自引用(递归)表,包含以下列:

MenuItemId - int, primary key, identity
DisplayName - varchar
ParentMenuItemId - int, nullable, FK to MenuItemId

然后我插入您在OP中识别的值,向下钻取Cars / Coupe / BMW。

这是MVC3 / Razor,以及实体框架模型。

控制器:(该操作采用名为“id”的可为空的int参数,这意味着MVC将自动通过标准路由处理程序将其路由为/ Controller / Action / Id)

System.Text.StringBuilder sb = new System.Text.StringBuilder();

using (Models.StackOverflowTestEntities e = new Models.StackOverflowTestEntities())
{
    // Insert the child menu items based on the current parent
    ViewData["currentMenuItems"] = e.MenuItems.Where(i => (!id.HasValue && !i.ParentMenuItemId.HasValue) || (i.ParentMenuItemId == id)).ToList();

    // Get our breadcrumb trail
    if (id.HasValue)
    {
        int? currentItem = id;

        while (currentItem.HasValue)
        {
            var menuItem = e.MenuItems.Where(i => i.MenuItemId == currentItem).First();

            // TODO: make these into actual hyperlinks?
            sb.Insert(0, string.Format(" » {0}", menuItem.DisplayName));

            currentItem = menuItem.ParentMenuItemId;
        }
    }
}

sb.Insert(0, "Root");

ViewData["breadcrumb"] = sb.ToString();

查看:

<div>@ViewData["breadcrumb"]</div>

<ul>
@{
    var menuItems = ViewData["currentMenuItems"] as IEnumerable<MvcApplication1.Models.MenuItem>;

    foreach (var menuItem in menuItems) {
        <li><a href="/Home/Index/@menuItem.MenuItemId">@menuItem.DisplayName</a></li>
    }
}
</ul>

这不仅显示指定父级的相应项目列表,还显示返回根目录的痕迹痕迹。