Обдумав эту проблему некоторое время вместе с предложениями, я придумал это решение.Так как моя субнавигатор всегда будет ниже основной навигации, я решил использовать метод «Соглашение по конфигурации».
В моем 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; }
}
Я не уверен, что это лучший способ сделать это, но он работает довольно хорошо для небольшого проекта, над которым я сейчас работаю.
Спасибо за ответы!