2011-07-16 48 views
2

嗨我想動態加載_Layout.cshtml文件中的meny項目。如何在ASP.NET MVC中的Layout或MasterPage中動態加載菜單項?

我該怎麼做?你能指點我一個代碼示例嗎?或者其他的東西?

我不想尋找任何特殊的做法。

下面我將介紹我的意圖:

我只是想不同的菜單項在屏幕的左側呈現的列表。假設有一個菜單項的層次結構爲

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

所以intially只是分類菜單項渲染列表,然後一個人選擇一個類別和類型的菜單項列表呈現,一個的動產類型和品牌的菜單項列表呈現,一個人選擇一個品牌和一個列表模型的菜單項渲染,象下面這樣:

(菜單的初始外觀)

類別:

  • 汽車
  • 自行車
  • 摩托車

(汽車被選擇)

類型:

  • 跑車
  • 卡車
  • 敞篷

(雙門轎跑車被選擇)

品牌:

  • BMW
  • 沃爾沃
  • 福特
  • 梅賽德斯

(BMW被選擇)

型號:

  • 325i的
  • 的128i
  • 650i雙
  • M6 。
+0

此菜單是否必須以ajaxy方式動態打開,或者您打算每次有人點擊某個菜單項時進行回發,然後重新渲染頁面? –

+0

每當有人點擊一個菜單項時,我會呈現一個新的菜單,直到他們到達層次結構的最後一層,這個網站會在它的開始菜單中執行它:http://www.patch.com/ – rune007

回答

-1

如果你在談論具體的控制器或動作的項目,你可以有動作裝上去的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> 

這不僅顯示指定父項的適當項目列表,還顯示回到根的麪包屑路徑。

+0

嗨GalacticCowboy,以及在第一級菜單中選擇什麼,將管理下一級要顯示哪些菜單項目。像本網站的開頭一樣:http://www.patch.com/您能否提供一個簡單的代碼示例,以便我可以瞭解您的建議? – rune007

+0

然而,至少在技術細節方面,網站所採用的方式與您所描述的完全不同(至少在技術細節方面) - 他們只有2個關卡,然後他們將從這裏完全不同的子網域。我可以嘗試組合一個與*行爲*匹配的示例,即使它不完全相同。 – GalacticCowboy

+0

謝謝GalacticCowboy先生,你給我提供一些代碼是非常好的:-) – rune007

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看看,如果你有興趣的第三方的開源解決方案

+0

Hi Muhammed Adeel Zahid,I不要以爲你的解決方案是可行的,因爲下一個菜單是動態加載的,取決於在前一個菜單中選擇的內容。再看看我的問題。 – rune007

+0

這個網站的初始菜單就像我想要做的一樣:http://www.patch.com/ – rune007

+0

實際上符文,如果你看看你所指的網站patch.com,他們會這麼做正是這樣。您將需要使用javascript來隱藏/顯示特定的子菜單。 –

相關問題