Переменные представления в MVC-приложениях на ASP.NET
В этой серии статей обсуждаются некоторые аспекты, связанные с использованием представлений в модуле 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>
Результат:
Часть II. Что такое ViewBag, ViewData, TempData и Session?
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.
Часть III. Как работают ViewBag, ViewData, TempData и Session?
1. ViewBag и ViewData
Эти переменные можно использовать для передачи данных из контроллера в представление, но только в рамках одного запроса и только в одном направлении.
В следующем примере показано, что если переменной ViewBag
присвоить значение в одном действии (Index), а затем попытаться извлечь данные из другого представления (About), то это не сработает, т. к. мы имеем дело с двумя разными запросами.
Закомментируйте ViewBag
в шаблоне домашней страницы (Index).
Добавьте следующий код в шаблон 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
.
Разница между 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
не отображаются, как и ожидалось.
Шаг 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"]
.
Шаг 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"]
.
Шаг 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
, но извлекать данные из нее можно несколько раз.
Только полноправные пользователи могут оставлять комментарии. Аутентифицируйтесь пожалуйста, используя сервисы.