Почему _ViewStart.cshtml не может получить доступ к объекту ViewBag? - PullRequest
33 голосов
/ 05 июля 2011

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

Однако, с:

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

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

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

Ответы [ 6 ]

43 голосов
/ 28 декабря 2011

Короче ... Используйте сумку для просмотра контроллера.

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"]

Но каждыйview и частичное представление получают свой собственный экземпляр viewdata.

http://jeffreypalermo.com/blog/viewdata-mechanics-and-segmentation-excerpt-from-asp.net-mvc-in-action/

====================================================================

Естьдругое решение здесь: https://stackoverflow.com/a/4834382/291753

====================================================================

3 голосов
/ 24 сентября 2012

Этого можно добиться с помощью частичного просмотра.Поместите весь свой общий код, связанный с заголовком, в частичное представление с именем Title.cshtml в общей папке.В _viewstart просто вызовите частичное представление.

_ViewStart.cshtml :

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@Html.Partial("Title")

~ / Shared / Title.cshtml :

@{
 ViewBag.Title = "bytecourse - Online Courses in Technology"; 
}
3 голосов
/ 17 августа 2011

хмм, вы можете получить доступ к ViewBag через ViewData, например, ViewContext.ViewData["Title"].

Так, например, если вы установите данные ViewBag в фильтре действий, вы можете извлечь их из _ViewStart.cshtml, используя ViewContext.ViewData["Title"].

Но я попытался присвоить значение с помощью ViewContext.ViewData["Key"] = value;, и оно, похоже, не сохраняется в реальном представлении.

2 голосов
/ 05 июля 2011

Вы можете использовать разделы в _Layout, если хотите установить заголовок по умолчанию:

<title>
    @if (IsSectionDefined("Title"))
    {
        @RenderSection("Title")
    }
    else
    {
        @:bytecourse - Online Courses in Technology
    }
</title>

и вид изнутри, вы можете переопределить его:

@section Title {
    Overriden title
}

Еще одна причина не использовать ViewBag: -)

0 голосов
/ 08 января 2018

Вы можете создать одну страницу макета, которая использует ваши данные Viewbag, и добавить макет на вашу пустую _ViewStart страницу, она будет работать

на ViewStart.cshtml

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}
0 голосов
/ 05 июля 2011

Это не на 100% чисто, но посмотрите обходной путь, используя PageData или немного перечисления в:

Как настроить свойства ViewBag для _ViewStart.cshtml?

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