Строго типизированные представления

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

В предыдущих примерах для передачи информации из контроллера в представление использовался объект 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>
..............................

Кроме того, мы можем автоматически создать строго типизированное представление, указав в диалоговом окне при создании представления соответствующие параметры:

Строго типизированное представление в ASP.NET MVC 5

Для этого в поле Template надо выбрать любой другой шаблон, кроме Empty (without model), и после этого указать нужный класс модели и контекста данных. И если мы выберем шаблон List, то автоматически сгенерированное представление будет по своему функционалу идентично ранее рассмотренному представлению с выводом книг.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850