Как вы справляетесь с отображением навигации и суб-навигации в приложении MVC? - PullRequest
1 голос
/ 20 сентября 2009

У меня проблемы с определением места размещения навигации для приложения MVC. Например, скажем, у вас есть следующая структура:

  • Конференция
    • Юго-Восточная Конференция
      • Флорида Гаторс
      • Бульдоги Грузии
      • Арканзасские бритвы
    • Pac-10
      • USC
      • Гавайи
    • Большой Восток и т.д ...

Как бы вы лучше всего создали структуру для реализации «основной» навигации и последующей «под» навигации? Используя гипотетический пример, у вас будет отдельная суб-навигация для каждой конференции с указанием соответствующих колледжей (и только колледжей этой конференции).

Это то, что вы бы обрабатывали на главном экране и просто скрывали невыбранную конференцию? Или вы бы создали помощника по меню (или еще один фрагмент) и назвали бы это с точки зрения каждого отдельного колледжа?

Ответы [ 3 ]

1 голос
/ 21 сентября 2009

Почему бы не использовать какой-либо глобальный шаблон макета, который всегда отображает основную навигацию и использует какой-то помощник для визуализации subnav? (Помощник может быть лишним - вы можете просто вывести субнавигатор в шаблон макета)

Ваш контроллер передает текущую категорию / подкатегорию и некоторую структуру данных, описывающую текущие параметры субнавигатора, в представление.

1 голос
/ 21 сентября 2009

Обдумав эту проблему некоторое время вместе с предложениями, я придумал это решение.Так как моя субнавигатор всегда будет ниже основной навигации, я решил использовать метод «Соглашение по конфигурации».

В моем 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 голос
/ 21 сентября 2009

Лучший способ - использовать несколько вложенных главных страниц. например Site.master будет содержать вашу навигацию верхнего уровня (список конференций?), Тогда у вас будет отдельная главная страница для каждой конференции, которая будет «расширять» site.master. Теоретически вы можете иметь столько вложенных главных страниц, сколько хотите. Наконец, флоридские аллигаторы и т. Д. Будут «настоящими» представлениями (то есть не главными страницами).

Сложная часть сообщает любой родительской главной странице, какой элемент навигации выбран в данный момент. Поскольку вы не можете привязать главные страницы к ViewModel, вам придется использовать словарь просмотра, например, Просмотр [ "SelectedMainNavItem"].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...