Подтвердить что ты не робот

Почему _ViewStart.cshtml не может получить доступ к объекту ViewBag?

У меня есть файл _ViewStart.cshtml по умолчанию в папке /Views. Я хотел бы иметь доступ к моему объекту ViewBag, поэтому я могу установить заголовок по умолчанию для всех моих просмотров.

Однако, при:

@{
    Layout = "~/Views/Shared/SiteLayout.cshtml";
    ViewBag.Title = "bytecourse - Online Courses in Technology";
}

Я получаю "Имя" ViewBag "не существует в текущем контексте" как ошибка времени выполнения.

Что мне нужно сделать?

4b9b3361

Ответ 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"; 
}