Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
В предыдущих примерах для передачи информации из контроллера в представление использовался объект ViewBag:
@foreach (var b in ViewBag.Books) { <tr> <td><p>@b.Name</p></td> <td><p>@b.Author</p></td> <td><p>@b.Price</p></td> <td><p><a href="/Home/Buy/@b.Id">Купить</a></p></td> </tr> }
Здесь мы получаем доступ к элементам коллекции, заключенной в ViewBag.Books, с помощью переменной с ключевым словом var - то есть тип переменной у нас не задан явно и выводится компилятором. То же самое мы могли бы указать тип модели явно, применив полное имя типа модели:
@foreach (BookStore.Models.Book b in ViewBag.Books) { <tr> <td><p>@b.Name</p></td> <td><p>@b.Author</p></td> <td><p>@b.Price</p></td> <td><p><a href="/Home/Buy/@b.Id">Купить</a></p></td> </tr> }
Хотя примеры с объектом ViewBag работают как надо, но есть и другой способ, иногда более предпочтительный, который заключается в использовании строго типизированных представлений. Подобные представления позволяют передавать данные не через объект ViewBag, а напрямую в представление через параметр метода View. Код метода контроллера мог бы выглядеть так:
BookContext db = new BookContext(); public ActionResult Index() { return View(db.Books); }
Теперь, чтобы связать представление с передаваемым параметром, надо добавить в представление директиву @model с указанием типа передаваемых данных. Поскольку books представляет тип IEnumerable<Book>, то представление будет выглядеть так:
@model IEnumerable<BookStore.Models.Book> @{ Layout = "~/Views/Shared/_Layout.cshtml"; } <div> <h3>Распродажа книг</h3> <table> <tr class="header"><td><p>Название книги</p></td> <td><p>Автор</p></td> <td><p>Цена</p></td><td></td> </tr> @foreach (BookStore.Models.Book b in Model) { <tr> <td><p>@b.Name</p></td> <td><p>@b.Author</p></td> <td><p>@b.Price</p></td> <td><p><a href="/Home/Buy/@b.Id">Купить</a></p></td> </tr> } </table> </div>
Объект Model представляет тип модели, указанной в директиве @model
, и будет хранить переданные из контроллера данные.
Но чтобы не писать полностью имя типа модели, мы можем импортировать пространство имен в представлении:
@using BookStore.Models @model IEnumerable<Book> ..............................
Кроме того, мы можем автоматически создать строго типизированное представление, указав в диалоговом окне при создании представления соответствующие параметры:
Для этого в поле Template надо выбрать любой другой шаблон, кроме Empty (without model), и после этого указать нужный класс модели и контекста данных. И если мы выберем шаблон List, то автоматически сгенерированное представление будет по своему функционалу идентично ранее рассмотренному представлению с выводом книг.