В этой серии статей обсуждаются некоторые аспекты, связанные с использованием представлений в модуле MVC. Razor Engine в MVC Переменные представления в MVC-приложениях на ASP.NET — эта статья Переменные представления в MVC-приложениях на ASP.NET Core Partial, RenderParial, Action, RenderAction Содержание статьи: MVC-приложения на ASP.NET Настройка среды для тестирования кода Что такое ViewBag, ViewData, TempData и Session? Как работают ViewBag, ViewData, TempData и Session? ViewBag и ViewData TempData Session MVC-приложения на ASP.NET Core (рассматриваются в следующей статье) Что такое ViewBag, ViewData, TempData и Session? Как работают ViewBag, ViewData, TempData и Session? Шаг 1. Создание MVC-приложения на ASP.NET Для создания приложения будем использовать текущую версию Visual Studio 2019 16.9.4 и платформу .NET Framework 4.8. Запустите Visual Studio и выберите Create a new project (Создать новый проект). В диалоговом окне создания проекта выберите ASP.NET Web Application (.NET Framework) (Веб-приложение ASP.NET [.NET Framework]) и нажмите кнопку Next (Далее). В диалоговом окне Configure your new project (Настройка нового проекта) введите MVC в качестве имени проекта (Project name) и нажмите кнопку Create (Создать). В диалоговом окне Create a new ASP.NET Web Application (Создание веб-приложения ASP.NET) выберите MVC и нажмите кнопку Create (Создать). Примечание: Инструкции для новичков можно найти здесь. Шаг 2. Добавление ViewBag, ViewData, TempData и Session В контроллере измените действие HomeController/Index. Внесите следующие изменения в шаблон View/Home/Index.cshtml. Результат: ViewBag, ViewData, TempData и Session представляют собой варианты отправки значений из контроллера в представление либо в другой метод действия или на страницу действий. 1. Они являются свойствами контроллера в MVC Если конкретнее, ViewBag, ViewData и TempData — это свойства класса ControllerBase, который является родителем класса Controller. Session является свойством класса Controller: 2. Тип Все эти переменные имеют тип Dictionary со строкой в качестве ключа, за исключением переменной ViewBag, которая имеет динамический тип: ViewData — public System.Web.Mvc.ViewDataDictionary ViewData { get; set; } ViewBag — public dynamic ViewBag { get; } TempData — public System.Web.Mvc.TempDataDictionary TempData { get; set; } Session — public System.Web.HttpSessionStateBase Session { get; } Примечание. ViewBag представляет собой обертку над ViewData и позволяет сохранять и извлекать значения, используя синтаксис «объект — значение», а не «ключ — значение», как в случае объектов типа Dictionary. Это возможно за счет особенностей динамического типа данных, доступного в .NET.   1. ViewBag и ViewData Эти переменные можно использовать для передачи данных из контроллера в представление, но только в рамках одного запроса и только в одном направлении. В следующем примере показано, что если переменной ViewBag присвоить значение в одном действии (Index), а затем попытаться извлечь данные из другого представления (About), то это не сработает, т. к. мы имеем дело с двумя разными запросами. Закомментируйте ViewBag в шаблоне домашней страницы (Index). Добавьте следующий код в шаблон View/Home/About.cshtml. Запустите приложение. Откроется домашняя страница. Затем нажмите кнопку About, чтобы перейти на страницу About. Произошла ошибка, поскольку значение, определенное в переменной ViewBag, существует только в соответствующем действии и запросе. Таким образом, если значение ViewBag нужно получать в View/Home/About.cshtml, оно должно быть определено в действии About. Разница между ViewBag и ViewData: ViewData При передаче строки в переменную ViewData нет необходимости в приведении типов. При передаче объекта в переменную ViewData необходимо выполнять приведение типов, при чем перед этим необходимо проверять, не равен ли объект значению null. ViewBag ViewBag имеет динамический тип, поэтому необходимости в приведении типов нет. 2. TempData TempData используется для передачи данных из представления в контроллер, из контроллера в представление или из одного метода действия в другой метод действия того же или другого контроллера. TempData сохраняет данные временно и автоматически удаляет их после извлечения значения, т. е. значение можно извлечь ровно один раз. Продемонстрируем на примере, как TempData передает информацию (последовательно выполняйте код из примера с шага 1 по шаг 4). Шаг 1. Перейдите к действию Index и определите TempData В представлении закомментируйте TempData. Результат: значения из TempData не отображаются, как и ожидалось. Шаг 2. Ничего не меняйте в действии Contact, но внесите изменения в соответствующее представление Извлеките TempData["Student"] и переопределите TempData["name"] = "Steve". Результат: показываются извлеченные значения TempData["Student"]. Шаг 3. Перейдите к действию About Извлеките TempData["name"] и переопределите TempData["Student"]. В представлении выведите TempData["Student"]. Результат: как и ожидалось, показываются данные из TempData["Student"]. Шаг 4 Наконец, вернитесь назад и нажмите кнопку Contact. Таким образом вы попытаетесь второй раз извлечь TempData["Student"] и получите ошибку. Подведем итог: TempData хранит данные в сессии, поэтому по истечении длительности сессии данные теряются. TempData удаляет ключ/значение сразу после доступа к ним, однако их можно сохранить для последующего запроса, если вызвать метод TempData.Keep(). TempData обычно используется для передачи сообщений об ошибках или чего-либо подобного. 3. Session Переменная Session хранит данные в сессии. Переменная Session, в отличие от TempData, хранит данные не для однократного доступа. Их можно считывать сколько угодно раз. Переменная Session никогда не принимает значение null, пока не истечет время сессии или не наступит ее тайм-аут. Не рекомендуется использовать Session слишком часто или сохранять в этой переменной большие объемы данных, т. к. это сказывается на производительности. В этой статье рассмотрены переменные представления ViewBag, ViewData, TempData и Session, доступные в MVC-приложениях на ASP.NET. В следующей статье мы рассмотрим те же переменные в контексте ASP.NET Core. MVC-приложения на ASP.NET Настройка среды для тестирования кода Что такое ViewBag, ViewData, TempData и Session? Как работают ViewBag, ViewData, TempData и Session? ViewBag и ViewData можно использовать для передачи данных из контроллера в представление, но только в рамках одного запроса и только в одном направлении. TempData позволяет передавать данные из представления в контроллер, из контроллера в представление или из одного метода действия в другой метод действия того же или другого контроллера. Извлекать данные из этой переменной можно ровно один раз. Session — эта переменная похожа на TempData, но извлекать данные из нее можно несколько раз. Ссылки ViewData, ViewBag, TempData и Session в MVC — advancesharp.com В чем разница между ViewData и TempData? — stackoverflow.com Сравнение ViewData, ViewBag и TempData в MVC — c-sharpcorner Класс Controller — Microsoft Класс ControllerBase — Microsoft Материал подготовлен в рамках курса «C# Developer. Professional». Если вам интересно узнать подробнее о формате обучения и программе, познакомиться с преподавателем курса — приглашаем на день открытых дверей онлайн. Регистрация здесь. Переводчик, редактор