Существуют различные способы передачи данных из контроллера в представление:
ViewData
ViewBag
Модель представления
ViewData представляет словарь из пар ключ-значение:
public IActionResult Index() { ViewData["Message"] = "Hello METANIT.COM"; return View(); }
Здесь динамически определяется во ViewData объект с ключом "Message" и значением "Hello METANIT.COM". При этом в качестве значения может выступать любой объект. И после этому мы можем его использовать в представлении:
@{ ViewData["Title"] = "ASP.NET Core MVC"; } <h2>@ViewData["Title"]</h2> <h3>@ViewData["Message"]</h3>
Причем не обязательно устанавливать все объекты во ViewData в контроллере. Так, в данном случае объект с ключом "Title" устанавливается непосредственно в представлении. В итоге в браузере мы увидим значения обоих элементов из ViewData:
ViewBag во многом подобен ViewData. Он позволяет определить различные свойства и присвоить им любое значение. Так, мы могли бы переписать предыдущий пример следующим образом:
public IActionResult Index() { ViewBag.Message = "Hello METANIT.COM"; return View(); }
И таким же образом нам надо было бы изменить представление:
@{ ViewBag.Title = "ASP.NET Core MVC"; } <h2>@ViewBag.Title.</h2> <h3>@ViewBag.Message</h3>
И не важно, что изначально объект ViewBag не содержит никакого свойства Message, оно определяется динамически. При этом свойства ViewBag могут содержать не только простые объекты типа string или int, но и сложные данные. Например, передадим список:
public IActionResult Index() { ViewBag.People = new List<string> { "Tom", "Sam", "Bob" }; return View(); }
И также в представлении мы можем получить этот список:
<h2>Count: @ViewBag.People.Count</h2> <ul> @foreach(string person in ViewBag.People) { <li>@person</li> } </ul>
Модель представления является во многих случаях более предпочтительным способом для передачи данных в представление. Для передачи данных в представление используется одна из версий метода View:
public IActionResult Index() { var people = new List<string> { "Tom", "Sam", "Bob" }; return View(people); }
В метод View передается список, поэтому моделью представления Index.cshtml будет тип List<string> (либо IEnumerable<string>). И теперь в представлении мы можем написать так:
@model List<string> <h2>Count: @Model.Count</h2> <ul> @foreach(string person in Model) { <li>@person</li> } </ul>
В самом начале представления с помощью директивы @model
устанавливается модель представления. Тип модели должен совпадать с типом объекта, который передается в
метод View()
в контроллере.
Установка модели указывает, что объект Model теперь будет представлять объект List<string> или список. И мы сможем использовать Model в качестве списка.
Представления, для которых определена модель, еще называют строго типизированными или strongly-typed views.