Рендеринг навигации в MVC3 - PullRequest
3 голосов
/ 02 марта 2011

Какой лучший способ визуализации навигации в MVC3?В моем приложении Контроллер должен решить, что должно быть в Навигации, но, насколько я знаю, нет способа передать Модель в файл _Layout (где живет HTML-код Навигации), чтобы дать ему эту информацию.

Ответы [ 3 ]

6 голосов
/ 02 марта 2011

Вы можете сделать модель доступной для вашего макета.

  1. Определите базовый класс MyBaseModel со свойствами, которые вы хотите использовать для макета.
  2. Сделайте ваши модели подклассами MyBaseModel и убедитесь, что вы заполнили свойства
  3. Укажите в макете @model MyBaseModel
  4. Используйте свойства

См. Также это сообщение в блоге , где решается похожая проблема («нам часто приходится включать одну и ту же информацию в каждую страницу»).

4 голосов
/ 02 марта 2011

Best - относительный и субъективный термин. Я бы обычно использовал подход, аналогичный ответу druttka, но другой вариант - использовать RenderAction() для вызова действия контроллера

<div>@Html.RenderAction("action", "controller")</div>
3 голосов
/ 02 марта 2011

Я предложу несколько контраргументов на ответ @ druttka. Но в основном вы должны решить, какую сделку вы хотите совершить.

Если вы используете модель для своего обзора, теперь вы заставляете 2 вещи:

  1. Каждый вид должен быть строго напечатан
  2. Каждое действие должно вызывать функцию для заполнения всех уровней навигации, включенных в вашу модель представления

Первый пункт не так уж и плох, потому что на типичном нестатическом сайте очень мало страниц, которые в любом случае не будут производными от модели, и достаточно просто создать пустую модель для этих страниц. Однако второй момент гораздо более раздражает. Каждая функция должна создавать свою собственную модель, а затем заполнять свойства nav для каждого уровня навигации, предоставляемого моделью. Это может быть довольно громоздким, но может быть довольно элегантно обработано в OnActionExecuted по крайней мере для nav, который не является специфическим для данного действия.

Альтернатива - добавить навигацию к ViewBag. Это может быть сделано всякий раз, когда вам не нужно указывать модель для каждого представления, что очень удобно для тех случаев, когда вам не нужно указывать модель. Однако следует отметить, что ViewBag в asp.net mvc 3 относится к типу dynamic, который нельзя использовать в качестве параметра в лямбда-функции, что не позволяет вам делать что-то вроде @Html.DisplayFor(viewBag => viewBag.MainNav) в макете, который является реальное сопротивление Тем не менее, вы все равно можете выполнить частичное отображение и указать соответствующий DisplayTemplate.

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