Как записать динамические данные в макет страницы в MVC 3 Razor?
Автор вопроса: DimskiyОтветов: 2
У меня есть проект MVC 3 С# с движком Razor. Каковы способы и, я думаю, лучшие практики для записи динамических данных в _Layout.cshtml?
Например, может быть, я хотел бы отобразить имя пользователя в правом верхнем углу моего веб-сайта, и это имя исходит от сеанса, БД или чего-то еще в зависимости от того, какой пользователь вошел в систему.
ОБНОВЛЕНИЕ: я также ищу хорошую практику рендеринга определенных данных в элемент макета. Например, если мне нужно отобразить определенный файл CSS в зависимости от учетных данных вошедшего в систему пользователя.
(Для приведенного выше примера я подумал об использовании помощников URL.)
В дополнение к ответу atbebtg, чтобы отобразить материал в голове, вы хотите использовать поддержку раздела Razor. Разделы - это именованные фрагменты шаблонного HTML, которые могут быть определены в представлениях и отображены в макете там, где он считает нужным. В макете вы вызываете @RenderSection("wellKnownSectionName"), а в представлении, использующем макет, объявляете @section wellKnownSectionName { <link rel="stylesheet" href="@UserStylesheetUrl" /><script type="text/javascript" src="@UserScriptUrl"> }. Обычно вы хотите описать назначение раздела в его названии, например, "documentHead".
Обновление: если вы визуализируете один и тот же HTML-шаблон в каждом представлении, вместо этого он попадет в макет. (Поскольку ваш макет включает теги HEAD и BODY, вы можете просто добавить соответствующий код в их тег HEAD.) Вам просто нужно убедиться, что вы передаете информацию, необходимую для макета, из контроллера через ViewBag/View.Model. /ВидДанные. Таким образом, ваш макет будет включать в себя следующее:
и ваш контроллер будет включать логику для заполнения ViewBag.UserName:
ViewBag.UserName = Session["UserName"];
(В идеале вы должны использовать строго типизированную модель представления, и я бы порекомендовал вам воздержаться от использования сеанса для чего-либо, поскольку его преимущества невелики по сравнению с альтернативами и обходится дорого для архитектуры... вместо этого я бы просто рекомендовал хранить некоторые зашифрованные cookie в браузере, который содержит имя пользователя или что-то еще, что вы можете использовать при каждой загрузке страницы для извлечения объекта пользователя из кеша/БД/сервиса.)