Почему _ViewStart.cshtml не может получить доступ к объекту ViewBag?
У меня есть файл _ViewStart.cshtml по умолчанию в папке /Views. Я хотел бы иметь доступ к моему объекту ViewBag, поэтому я могу установить заголовок по умолчанию для всех моих просмотров.
Однако, при:
@{
Layout = "~/Views/Shared/SiteLayout.cshtml";
ViewBag.Title = "bytecourse - Online Courses in Technology";
}
Я получаю "Имя" ViewBag "не существует в текущем контексте" как ошибка времени выполнения.
Что мне нужно сделать?
Ответы
Ответ 1
Короче... Используйте сумку для просмотра контроллера.
ViewContext.Controller.ViewBag.MyVar = "myVal";
и
@ViewContext.Controller.ViewBag.MyVar
=============================================== ================
Здесь есть хорошая информация: http://forums.asp.net/post/4254825.aspx
=============================================== ================
Как правило, ViewData [ "StoreName" ] совпадает с ViewBag.StoreName
Кроме того, Controller.ViewData [ "StoreName" ] = Controller.StoreName = ViewContext.Controller.ViewBag.StoreName = ViewContext.Controller.ViewData [ "StoreName" ]
Но каждый вид и частичный вид получают свой собственный экземпляр представлений.
http://jeffreypalermo.com/blog/viewdata-mechanics-and-segmentation-excerpt-from-asp.net-mvc-in-action/
=============================================== ================
Здесь есть еще одно решение: fooobar.com/questions/165591/...
=============================================== ================
Ответ 2
hmm, вы можете получить доступ к ViewBag через ViewData, например. ViewContext.ViewData["Title"]
.
Итак, если вы установите данные ViewBag в фильтр действий, например, вы можете вытащить его из _ViewStart.cshtml, используя ViewContext.ViewData["Title"]
.
Но я попытался присвоить значение с помощью ViewContext.ViewData["Key"] = value;
, и он, похоже, не сохранился до фактического представления.
Ответ 3
Вы можете использовать разделы в _Layout, если хотите установить заголовок по умолчанию:
<title>
@if (IsSectionDefined("Title"))
{
@RenderSection("Title")
}
else
{
@:bytecourse - Online Courses in Technology
}
</title>
и внутри просмотров вы можете переопределить его:
@section Title {
Overriden title
}
Еще одна причина не использовать ViewBag
: -)
Ответ 4
Вы можете добиться этого, используя частичные виды. Поместите весь общий код, связанный с заголовком, в частичный вид, который называется Title.cshtml
в общей папке. В _viewstart
просто вызовите Partial view.
_ViewStart.cshtml
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
@Html.Partial("Title")
~/Shared/Title.cshtml
@{
ViewBag.Title = "bytecourse - Online Courses in Technology";
}
Ответ 5
Не очищается на 100%, но см. обходной путь с использованием PageData или немного перечисления:
Как установить свойства ViewBag на _ViewStart.cshtml?