Переменные представления в MVC-приложениях на ASP.NET

  • Михаил
  • 12 мин. на прочтение
  • 105
  • 21 Jun 2022
  • 21 Jun 2022

В этой серии статей обсуждаются некоторые аспекты, связанные с использованием представлений в модуле 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, но извлекать данные из нее можно несколько раз.