![](https://habrastorage.org/getpro/habr/upload_files/7b5/b8c/ce6/7b5b8cce6a6a4459b51dca8f974c9219.png)
В этой серии статей обсуждаются некоторые аспекты, связанные с использованием представлений в модуле 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?
Часть I. Настройка среды MVC для тестирования кода
Шаг 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.
namespace MVC.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
List<string> Student = new List<string>();
Student.Add("Jignesh");
Student.Add("Tejas");
Student.Add("Rakesh");
this.ViewData["Student"] = Student;
this.ViewBag.Student = Student;
this.TempData["Student"] = Student;
this.HttpContext.Session["Student"] = Student;
return View();
}
......
}
}
Внесите следующие изменения в шаблон View/Home/Index.cshtml.
@{
ViewBag.Title = "Home Page";
}
<br>
<br>
@*<ul>
<b>ViewBag</b>
@foreach (var student in ViewBag.Student)
{
<li>@student</li>
}
</ul>*@
<ul>
<b>ViewData</b>
@foreach (var student in ViewData["Student"] as List<string>)
{
<li>@student</li>
}
</ul>
<ul>
<b>TempData</b>
@foreach (var student in TempData["Student"] as List<string>)
{
<li>@student</li>
}
</ul>
<ul>
<b>Session</b>
@foreach (var student in Session["Student"] as List<string>)
{
<li>@student</li>
}
</ul>
Результат:
![](https://habrastorage.org/getpro/habr/upload_files/5f9/e4b/6e5/5f9e4b6e56e1f4fe4bf4442048742436.png)
Часть II. Что такое ViewBag, ViewData, TempData и Session?
ViewBag
, ViewData
, TempData
и Session представляют собой варианты отправки значений из контроллера в представление либо в другой метод действия или на страницу действий.
1. Они являются свойствами контроллера в MVC
Если конкретнее, ViewBag
, ViewData
и TempData
— это свойства класса ControllerBase
, который является родителем класса Controller
.
![](https://habrastorage.org/getpro/habr/upload_files/a8b/f6a/017/a8bf6a01781e0999423f3ca6183d9047.png)
Session
является свойством класса Controller
:
![](https://habrastorage.org/getpro/habr/upload_files/b27/c5e/3ae/b27c5e3ae57afb7eb51978f82eab3e21.png)
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.
Часть III. Как работают ViewBag, ViewData, TempData и Session?
1. ViewBag и ViewData
Эти переменные можно использовать для передачи данных из контроллера в представление, но только в рамках одного запроса и только в одном направлении.
![](https://habrastorage.org/getpro/habr/upload_files/562/93a/84e/56293a84e2c8e1a09da41e7b2f0da91f.png)
![](https://habrastorage.org/getpro/habr/upload_files/783/55f/bfe/78355fbfe713c0c1d295398b440066f4.png)
В следующем примере показано, что если переменной ViewBag
присвоить значение в одном действии (Index), а затем попытаться извлечь данные из другого представления (About), то это не сработает, т. к. мы имеем дело с двумя разными запросами.
Закомментируйте ViewBag
в шаблоне домашней страницы (Index).
![](https://habrastorage.org/getpro/habr/upload_files/b44/55f/b23/b4455fb23fd0760b54845b630244da7a.png)
Добавьте следующий код в шаблон View/Home/About.cshtml.
<ul>
<b>ViewBag</b>
@foreach (var student in ViewBag.Student)
{
<li>@student</li>
}
</ul>
Запустите приложение. Откроется домашняя страница. Затем нажмите кнопку About, чтобы перейти на страницу About.
Произошла ошибка, поскольку значение, определенное в переменной ViewBag
, существует только в соответствующем действии и запросе. Таким образом, если значение ViewBag
нужно получать в View/Home/About.cshtml, оно должно быть определено в действии About
.
![](https://habrastorage.org/getpro/habr/upload_files/e69/a8b/b12/e69a8bb12de6e08c669b9224542257f6.png)
Разница между ViewBag
и ViewData
:
-
ViewData
При передаче строки в переменную
ViewData
нет необходимости в приведении типов.При передаче объекта в переменную
ViewData
необходимо выполнять приведение типов, при чем перед этим необходимо проверять, не равен ли объект значениюnull
.
-
ViewBag
ViewBag
имеет динамический тип, поэтому необходимости в приведении типов нет.
2. TempData
TempData
используется для передачи данных из представления в контроллер, из контроллера в представление или из одного метода действия в другой метод действия того же или другого контроллера.
TempData
сохраняет данные временно и автоматически удаляет их после извлечения значения, т. е. значение можно извлечь ровно один раз.
Продемонстрируем на примере, как TempData
передает информацию (последовательно выполняйте код из примера с шага 1 по шаг 4).
Шаг 1. Перейдите к действию Index и определите TempData
public ActionResult Index()
{
List<string> Student = new List<string>();
Student.Add("Jignesh");
Student.Add("Tejas");
Student.Add("Rakesh");
this.ViewData["Student"] = Student;
this.ViewBag.Student = Student;
this.TempData["Student"] = Student;
this.HttpContext.Session["Student"] = Student;
return View();
}
В представлении закомментируйте TempData
.
@{
ViewBag.Title = "Home Page";
}
<br>
<br>
<ul>
<b>ViewBag</b>
@foreach (var student in ViewBag.Student)
{
<li>@student</li>
}
</ul>
<ul>
<b>ViewData</b>
@foreach (var student in ViewData["Student"] as List<string>)
{
<li>@student</li>
}
</ul>
@*<ul>
<b>TempData</b>
@foreach (var student in TempData["Student"] as List<string>)
{
<li>@student</li>
}
</ul>*@
<ul>
<b>Session</b>
@foreach (var student in Session["Student"] as List<string>)
{
<li>@student</li>
}
</ul>
Результат: значения из TempData
не отображаются, как и ожидалось.
![](https://habrastorage.org/getpro/habr/upload_files/5a3/38d/19e/5a338d19e589d81527e7ba8011245545.png)
Шаг 2. Ничего не меняйте в действии Contact, но внесите изменения в соответствующее представление
Извлеките TempData["Student"]
и переопределите TempData["name"] = "Steve"
.
}
<h2>@ViewBag.Title.</h2>
<h3>@ViewBag.Message</h3>
<address>
One Microsoft Way<br />
Redmond, WA 98052-6399<br />
<abbr title="Phone">P:</abbr>
425.555.0100
</address>
<address>
<strong>Support:</strong> <a href="mailto:Support@example.com">Support@example.com</a><br />
<strong>Marketing:</strong> <a href="mailto:Marketing@example.com">Marketing@example.com</a>
</address>
<ul>
<b>TempData</b>
@foreach (var student in TempData["Student"] as List<string>)
{
<li>@student</li>
}
</ul>
@{
TempData["name"] = "Steve";
}
<ul>
<b>Session</b>
@foreach (var student in Session["Student"] as List<string>)
{
<li>@student</li>
}
</ul>
Результат: показываются извлеченные значения TempData["Student"]
.
![](https://habrastorage.org/getpro/habr/upload_files/02a/d65/2a1/02ad652a174ec2d049c48281ce94729e.png)
Шаг 3. Перейдите к действию About
Извлеките TempData["name"]
и переопределите TempData["Student"]
.
public ActionResult About()
{
ViewBag.Message = "Your application description page.";
if (TempData["name"].ToString() == "Steve")
{
List<string> Student = new List<string>();
Student.Add("Jignesh");
Student.Add("Tejas");
Student.Add("Rakesh");
this.ViewData["Student"] = Student;
this.ViewBag.Student = Student;
this.TempData["Student"] = Student;
this.HttpContext.Session["Student"] = Student;
}
return View();
}
В представлении выведите TempData["Student"]
.
<ul>
<b>TempData</b>
@foreach (var student in TempData["Student"] as List<string>)
{
<li>@student</li>
}
</ul>
<ul>
<b>Session</b>
@foreach (var student in Session["Student"] as List<string>)
{
<li>@student</li>
}
</ul>
Результат: как и ожидалось, показываются данные из TempData["Student"]
.
![](https://habrastorage.org/getpro/habr/upload_files/9b8/bbc/c63/9b8bbcc6380f2478f169cb1466576ab2.png)
Шаг 4
Наконец, вернитесь назад и нажмите кнопку Contact. Таким образом вы попытаетесь второй раз извлечь TempData["Student"]
и получите ошибку.
![](https://habrastorage.org/getpro/habr/upload_files/179/237/c16/179237c16dc6b8babf777d7b059370db.png)
Подведем итог:
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». Если вам интересно узнать подробнее о формате обучения и программе, познакомиться с преподавателем курса — приглашаем на день открытых дверей онлайн. Регистрация здесь.
euroUK
А точно подготовлен, а не скопипащен с csharp corner у какого-то индуса? А то имена студентов как бы намекают, что подготовка прошла не очень
Название списка объектов в единственном числе - все как профессионалы любят.