如果你在談論具體的控制器或動作的項目,你可以有動作裝上去的ViewData將被讀通過任何視圖呈現菜單。
編輯:一個工作示例
的數據結構:一個自我指涉(遞歸)表具有以下的列:
MenuItemId - int, primary key, identity
DisplayName - varchar
ParentMenuItemId - int, nullable, FK to MenuItemId
然後我插你在OP確定的值,下鑽通過汽車/跑車/寶馬。
這是MVC3/Razor以及實體框架模型。
控制器:(動作有一個名爲「身份證」可爲空的int參數,這意味着MVC會自動將它通過標準的路由處理程序/控制器/動作/ 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>
這不僅顯示指定父項的適當項目列表,還顯示回到根的麪包屑路徑。
此菜單是否必須以ajaxy方式動態打開,或者您打算每次有人點擊某個菜單項時進行回發,然後重新渲染頁面? –
每當有人點擊一個菜單項時,我會呈現一個新的菜單,直到他們到達層次結構的最後一層,這個網站會在它的開始菜單中執行它:http://www.patch.com/ – rune007