Может ли контроллер влиять на файл _layout.cshtml? - PullRequest
7 голосов
/ 14 декабря 2010

Я застрял! У меня сложилось впечатление, что файл _layout.cshtml используется для контента, похожего на MasterPage. Все там отображается на каждой странице. Естественно, я хочу написать код для рендеринга моего меню боковой панели в этом файле.

Я хочу динамически отображать список категорий из моей БД, но у меня проблема с передачей фактической модели категорий в Layout.cshtml, поскольку кажется, что ни один контроллер на самом деле не касается этого.

Есть предложения?

В противном случае, скажите, пожалуйста, как подойти к этой проблеме. Последние три дня я ломал голову и до сих пор не нашел элегантного решения.

Мне нужно:

  1. Динамически получить список категорий из БД.
  2. Отображение этого списка категорий при каждом просмотре. (Отсюда и использование _layout.cshtml)
  3. Элегантно обрабатывайте каждую категорию нажатием.

Я в своем уме. : P Как бы ты решил это?

Ответы [ 4 ]

2 голосов
/ 30 марта 2011

_layout.cshtml

@if(isSectionDefined("Categories"))
{
    <div id="sidebar">
      @RenderSection("Categories", required: false )
    </div>
}

index.cshtml

@section Categories {
<ul>
  <li>Category One</li>
  <li>Category Two</li>
  <li>Category Three</li>
</ul>
}

см. Это: http://weblogs.asp.net/scottgu/archive/2010/12/30/asp-net-mvc-3-layouts-and-sections-with-razor.aspx

1 голос
/ 04 июля 2011

На мой взгляд, ViewData (и его родственники, такие как ViewBag, Model и т. Д.) Предназначены для конкретного текущего представления .Ваш _Layout.cshtml не относится к текущему представлению;и было бы неловко, если бы КАЖДОМУ контроллеру пришлось бы передавать данные категорий в дополнение к любым другим данным, которые ему нужно передать для представления.

Вместо этого я предоставляю статический метод в одном из моихвспомогательные классы, которые извлекают категории из БД.Я также выполняю там некоторое кэширование, чтобы мне не приходилось обращаться к БД при каждом отдельном запросе.Затем _Layout.cshtml просто вызывает этот статический метод.Просто и элегантно.

Если хотите, вы можете вывести это на частичный вид, сделать его вспомогательным методом, что угодно.

Хотя одно замечание: мой пользовательский вид ошибок также используеттот же _Layout.cshtml, и если БД отключается, вы получаете исключение, пытаясь отобразить исключение.ASP.NET MVC достаточно умен, чтобы обнаружить это и прервать обработку, но у вас осталась неописуемая страница ошибок по умолчанию.Что я сделал, так это разместил операторы try...catch вокруг этих опасных вызовов, которые тихо игнорируют исключение, если текущая страница является представлением ошибок.

1 голос
/ 14 декабря 2010

Любая модель представления, которую вы передаете своему представлению, автоматически доступна на вашей главной странице.Если вы не используете RenderAction / Action, который является лучшим подходом, то вы должны создать необходимые данные главной страницы в каждом действии и добавить их в viewdata - либо имея общий базовый класс для строго типизированной модели представления, которая содержит все данные главной страницыили используя словарь viewdata.

Я бы настоятельно рекомендовал вам использовать подход html.action.Таким образом, у вас есть совершенно отдельное действие контроллера для работы с вашим списком категорий.Это действие может извлечь необходимые данные категории и вернуть userlist-контроль категории-списка как частичное представление, и вам не придется беспокоиться о загрязнении всех ваших других действий этими данными.

0 голосов
/ 15 декабря 2010

Я достиг чего-то похожего, когда мои ViewModels реализовали интерфейс, в котором есть члены, содержащие данные меню.В моем методе действия я установил эти данные.Затем, с моей точки зрения, я проверяю, реализует ли моя модель представления этот интерфейс, вытаскивает данные меню и отображает меню (фактически в частичном представлении)

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