2009-09-20 93 views
1

我無法確定將MVC應用放置在哪裏。例如,假設您有以下結構:你如何處理在MVC應用程序中顯示導航和子導航?

  • 會議
    • 東南聯盟
      • 佛羅里達短吻鱷隊
      • 佐治亞牛頭犬
      • 阿肯色剃刀鯨
    • PAC- 10
      • USC
      • 夏威夷
    • 大東等...

你會如何最好創建一個結構,實施 '主' 的導航和隨後的 '子'導航?使用假設的例子,您將爲每個會議設置特定的子導航,並顯示其各自的學院(僅限那些會議學院)。

這是你在主視圖中處理的事情,只隱藏非選定的會議? 或者你會創建一個菜單助手(或另一個部分),並從每個學院的角度來調用?

+0

夏威夷不在Pac-10。 (也不是Pac-12) – 2013-01-21 23:23:34

回答

1

在考慮了這個問題並提出了一些建議之後,我想出了這個解決方案。由於我的子導航將始終低於主導航,因此我決定使用「約定」配置方法。

在我的Site.Master中,我有以下兩個渲染部分。其中顯示主導航和其他品牌來BuildSubNavigation電話時顯示得部分的名稱來呈現:

<% Html.RenderPartial("_MainNavigation"); %> 
<% var submenu = ViewContext.BuildSubNavigation(); 
    if (submenu != null) { 
      Html.RenderPartial(submenu); 
}%> 

當然,這可能會被扔進一個幫手,我打算這樣做,這是更明確並有助於理解這個問題。

這樣做是調用BuildSubNavigation方法。它符合約定,如果一個控制器要有一個特定的子導航,將會有一部分以「_Navigation」的形式。因此,本例的精神,一個部分將是「_SouthEasternConferenceNavigation」我所做的是檢查以查看當前視圖是否實際存在。如果是這樣,我會返回名稱,然後用它來渲染部分。

public static string BuildSubNavigation(this ViewContext vc) { 
    var controller = vc.RouteData.Values["controller"] ?? ""; 
    var viewName = "_" + controller + "Navigation"; 

    if (ViewExists(vc.Controller.ControllerContext, viewName, null)) { 
     return viewName; 
    } else { 
     return null; 
    } 
} 

這是檢查查看是否實際存在針對當前視圖引擎的方法:

public static bool ViewExists(ControllerContext cc, string viewName, string masterName) { 
    if (ViewEngines.Engines.FindView(cc, viewName, masterName).View != null) { 
     return true; 
    } else { return false; } 
} 

我不確定這是否是做到這一點的最好辦法,但它的工作,而以及我目前正在進行的一個小項目。

感謝您的答案!

1

最好的方法是使用多個嵌套母版頁。例如Site.master將包含您的頂級導航(會議列表?),那麼您將有一個不同的主頁面爲每個會議'擴展'site.master。理論上,您可以根據需要擁有儘可能多的嵌套母版頁。最後,佛羅里達鱷魚等將是'真正'的意見(即非主頁面)。

棘手的部分是告訴任何父母母版頁目前選擇哪個導航項目。由於您無法將母版頁綁定到ViewModel,因此您必須使用查看字典,例如查看[ 「SelectedMainNavItem」。

+1

雖然這是嵌套母版頁的意圖,但我個人認爲這似乎是一種處理導航的醜陋方式。 – MunkiPhD 2009-09-21 03:02:01

1

爲什麼不使用一些總是顯示主導航的全局佈局模板,並依靠一些助手來渲染subnav? (該幫手可能是多餘的 - 您可能只是在佈局模板中內聯輸出子導航)

您的控制器將當前類別/子類別和描述當前子導航選項的某些數據結構傳遞給視圖。

+0

這與我的目標內聯,雖然似乎有一些限制,例如是否渲染部分/使用助手 – MunkiPhD 2009-09-21 03:03:01

+2

我不同意蒂姆。你的控制器應該不知道你的視圖如何決定渲染自己。控制器負責從模型中收集數據,然後將其呈現給選定的視圖 - 僅此而已。 – 2009-09-21 06:57:08