在考慮了這個問題並提出了一些建議之後,我想出了這個解決方案。由於我的子導航將始終低於主導航,因此我決定使用「約定」配置方法。
在我的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; }
}
我不確定這是否是做到這一點的最好辦法,但它的工作,而以及我目前正在進行的一個小項目。
感謝您的答案!
夏威夷不在Pac-10。 (也不是Pac-12) – 2013-01-21 23:23:34