Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
Существуют различные способы передачи данных из контроллера в представление:
ViewData
ViewBag
Модель представления
ViewData представляет словарь из пар ключ-значение:
public IActionResult Index() { ViewData["Message"] = "Hello ASP.NET Core"; return View(); }
Здесь динамически определяется во ViewData объект с ключом "Message" и значением "Hello ASP.NET Core". При этом в качестве значения может выступать любой объект. И после этому мы можем его использовать в представлении:
@{ ViewData["Title"] = "Index"; } <h2>@ViewData["Title"].</h2> <h3>@ViewData["Message"]</h3> <p>Random text.</p>
Причем не обязательно устанавливать все объекты во ViewData в контроллере. Так, в данном случае объект с ключом "Title" устанавливается непосредственно в представлении.
ViewBag во многом подобен ViewData. Он позволяет определить различные свойства и присвоить им любое значение. Так, мы могли бы переписать предыдущий пример следующим образом:
public IActionResult Index() { ViewBag.Message = "Hello ASP.NET Core"; return View(); }
И таким же образом нам надо было бы изменить представление:
@{ ViewBag.Title = "Index"; } <h2>@ViewBag.Title.</h2> <h3>@ViewBag.Message</h3> <p>Random text.</p>
И не важно, что изначально объект ViewBag не содержит никакого свойства Message, оно определяется динамически. При этом свойства ViewBag могут содержать не только простые объекты типа string или int, но и сложные данные. Например, передадим список:
public IActionResult Index() { ViewBag.Countries = new List<string> { "Бразилия", "Аргентина", "Уругвай", "Чили" }; return View(); }
И также в представлении мы можем получить этот список:
<h3>В списке @ViewBag.Countries.Count элемента:</h3> @foreach(string country in ViewBag.Countries) { <p>@country</p> }
Правда, чтобы выполнять различные операции, может потребоваться приведение типов, как в данном случае.
Модель представления является во многих случаях более предпочтительным способом для передачи данных в представление. Для передачи данных в представление используется одна из версий метода View:
public IActionResult Index() { List<string> countries = new List<string> { "Бразилия", "Аргентина", "Уругвай", "Чили" }; return View(countries); }
В метод View передается список, поэтому моделью представления Index.cshtml будет тип List<string> (либо IEnumerable<string>). И теперь в представлении мы можем написать так:
@model List<string> @{ ViewBag.Title = "Index"; } <h3>В списке @Model.Count элемента</h3> @foreach(string country in Model) { <p>@country</p> }
В самом начале представления с помощью директивы @model
устанавливается модель представления. Тип модели должен совпадать с типом объекта, который передается в
метод View()
в контроллере.
Установка модели указывает, что объект Model теперь будет представлять объект List<string> или список. И мы сможем использовать Model в качестве списка.
Представления, для которых определена модель, еще называют строго типизированными или strongly-typed views.