Поделиться через


Доступ к данным модели из нового контроллера

Рик Андерсон

Примечание

Обновленная версия этого руководства доступна здесь , используя последнюю версию Visual Studio. В новом руководстве используется ASP.NET Core MVC, который предоставляет множество улучшений по сравнению с этим руководством.

В этом руководстве описывается модель MVC ASP.NET Core с контроллерами и представлениями. Razor Pages — это новая альтернатива в ASP.NET Core, модель программирования на основе страниц, которая упрощает и повышает эффективность создания пользовательского веб-интерфейса. Мы рекомендуем ознакомиться с руководством по Razor Pages до версии MVC. Руководство по Razor Pages:

  • проще для выполнения;
  • охватывает дополнительные возможности;
  • Предпочтительный подход к разработке новых приложений.

В этом разделе вы создадите класс MoviesController и напишете код, который извлекает данные фильма и отображает их в браузере с помощью шаблона представления.

Выполните сборку приложения , прежде чем переходить к следующему шагу. Если вы не выполните сборку приложения, вы получите сообщение об ошибке при добавлении контроллера.

В Обозреватель решений щелкните правой кнопкой мыши папку Контроллеры и выберите пункт Добавить, а затем Контроллер.

Снимок экрана: окно Обозреватель решений. Откроется меню правой кнопкой мыши в папке Контроллеры и выбран пункт Добавить. В подменю выбран контроллер.

В диалоговом окне Добавление шаблона выберите Контроллер MVC 5 с представлениями с помощью Entity Framework и нажмите кнопку Добавить.

Снимок экрана: диалоговое окно

  • Выберите Movie (MvcMovie.Models) для класса Model.

  • Выберите MovieDBContext (MvcMovie.Models) для класса контекста Data.

  • В поле Имя контроллера введите MoviesController.

    На рисунке ниже показано завершенное диалоговое окно.

Снимок экрана: диалоговое окно

Нажмите кнопку Добавить. (Если вы получили сообщение об ошибке, вероятно, вы не сделали сборку приложения перед добавлением контроллера.) Visual Studio создает следующие файлы и папки:

  • Файл MoviesController.cs в папке Controllers .
  • Папка Views\Movies .
  • Create.cshtml, Delete.cshtml, Details.cshtml, Edit.cshtml и Index.cshtml в новой папке Views\Movies .

Visual Studio автоматически создает методы и представления действий CRUD (создание, чтение, обновление и удаление) (автоматическое создание методов действий и представлений CRUD называется формированием шаблонов). Теперь у вас есть полнофункциональное веб-приложение, которое позволяет создавать, перечислять, изменять и удалять записи фильмов.

Запустите приложение и щелкните ссылку MVC Movie (или перейдите к контроллеру Movies , добавив /Movies к URL-адресу в адресной строке браузера). Так как приложение использует маршрутизацию по умолчанию (определенную в файле App_Start\RouteConfig.cs ), запрос http://localhost:xxxxx/Movies браузера направляется в метод действия по умолчанию Index контроллера Movies . Другими словами, запрос http://localhost:xxxxx/Movies браузера фактически совпадает с запросом http://localhost:xxxxx/Movies/Indexбраузера . В результате будет пустой список фильмов, так как вы еще не добавили их.

Снимок экрана: страница фильма M V C с пустым списком индексов.

Создание фильма

Щелкните ссылку Create New (Создать). Введите некоторые сведения о фильме и нажмите кнопку Создать .

Снимок экрана: страница

Примечание

Возможно, вы не сможете ввести десятичные знаки или запятые в поле Цена. Для поддержки проверки jQuery для языковых стандартов, отличных от английского языка, в которых используется запятая (",") для десятичной запятой и форматов даты, отличных от US-English, необходимо включить globalize.js , а также файл языка и региональных параметров/globalize.cultures.js (из https://github.com/jquery/globalize ) и JavaScript для использования Globalize.parseFloat. Я покажу, как это сделать, в следующем руководстве. А пока вводите целые числа, такие как 10.

Нажатие кнопки Создать приводит к тому, что форма будет опубликована на сервере, где сведения о фильме сохраняются в базе данных. Затем вы будете перенаправлены по URL-адресу /Movies , где вы увидите созданный фильм в описании.

Снимок экрана: страница

Создайте еще несколько записей фильмов. Попробуйте воспользоваться ссылками Изменить, Сведения и Удалить — все они работают.

Изучение созданного кода

Откройте файл Controllers\MoviesController.cs и проверьте созданный Index метод. Ниже показана часть контроллера movie с методом Index .

public class MoviesController : Controller
{
    private MovieDBContext db = new MovieDBContext();

    // GET: /Movies/
    public ActionResult Index()
    {
        return View(db.Movies.ToList());
    }

Запрос к контроллеру Movies возвращает все записи в Movies таблице, а затем передает результаты в Index представление. Следующая строка из MoviesController класса создает экземпляр контекста базы данных фильмов, как описано выше. Контекст базы данных фильмов можно использовать для запроса, редактирования и удаления фильмов.

private MovieDBContext db = new MovieDBContext();

Строго типизированные модели и ключевое @model слово

Ранее в этом руководстве вы узнали, как контроллер может передавать данные или объекты в шаблон представления с помощью ViewBag объекта . ViewBag— это динамический объект, предоставляющий удобный способ передачи сведений в представление с поздним привязкой.

MVC также предоставляет возможность передавать строго типизированные объекты в шаблон представления. Этот строго типизированный подход обеспечивает более эффективную проверку кода во время компиляции и расширенные возможности IntelliSense в редакторе Visual Studio. Механизм формирования шаблонов в Visual Studio использовал этот подход (то есть передачу строго типизированной модели) с MoviesController шаблонами классов и представлений при создании методов и представлений.

В файле Controllers\MoviesController.cs проверьте созданный Details метод. Метод Details показан ниже.

public ActionResult Details(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    return View(movie);
}

Параметр id обычно передается как данные маршрута, например http://localhost:1234/movies/details/1 задает контроллер для контроллера фильма, для действия — значение details , а для — id значение 1. Вы также можете передать идентификатор с помощью строки запроса следующим образом:

http://localhost:1234/movies/details?id=1

Movie Если объект найден, экземпляр Movie модели передается в Details представление:

return View(movie);

Изучите содержимое файла Views\Movies\Details.cshtml :

@model MvcMovie.Models.Movie

@{
    ViewBag.Title = "Details";
}

<h2>Details</h2>

<div>
    <h4>Movie</h4>
<hr />
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.Title)
        </dt>
         @*Markup omitted for clarity.*@        
    </dl>
</div>
<p>
    @Html.ActionLink("Edit", "Edit", new { id = Model.ID }) |
    @Html.ActionLink("Back to List", "Index")
</p>

Включив @model оператор в начало файла шаблона представления, можно указать тип объекта, который ожидается в представлении. При создании контроллера movie Visual Studio автоматически включает следующий оператор @model в начало файла Details.cshtml:

@model MvcMovie.Models.Movie

Эта директива @model обеспечивает доступ к фильму, который контроллер передал в представление с использованием строго типизированного объекта Model. Например, в шаблоне Details.cshtml код передает каждое поле DisplayNameFor фильма в вспомогательные функции и DisplayFor HTML со строго типизированным Model объектом. Методы Create и Edit и шаблоны представлений также передают объект модели фильма.

Изучите шаблон представления Index.cshtml и Index метод в файле MoviesController.cs . Обратите внимание, что код создает List объект при вызове вспомогательного View метода в методе Index действия. Затем код передает этот Movies список из Index метода action в представление:

public ActionResult Index()
{
    return View(db.Movies.ToList());
}

При создании контроллера фильма Visual Studio автоматически включала следующую @model инструкцию в начало файла Index.cshtml :

@model IEnumerable<MvcMovie.Models.Movie>

Эта @model директива позволяет получить доступ к списку фильмов, которые контроллер передал в представление, используя строго типизированный Model объект. Например, в шаблоне Index.cshtml код циклически проходит по фильмам, выполняя инструкцию foreach над строго типизированным Model объектом:

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Title)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.ReleaseDate)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Genre)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Price)
        </td>
         <th>
            @Html.DisplayFor(modelItem => item.Rating)
        </th>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
            @Html.ActionLink("Details", "Details", new { id=item.ID })  |
            @Html.ActionLink("Delete", "Delete", new { id=item.ID }) 
        </td>
    </tr>
}

Model Так как объект строго типизирован (как IEnumerable<Movie> объект), каждый item объект в цикле типизирован как Movie. Среди других преимуществ это означает, что вы получаете проверку кода во время компиляции и полную поддержку IntelliSense в редакторе кода:

ModelIntelliSense

Работа с SQL Server LocalDB

Entity Framework Code First обнаружила, что предоставленная строка подключения к базе данных указывала на Movies базу данных, которая еще не существует, поэтому Code First создал базу данных автоматически. Чтобы убедиться, что он создан, зайдите в папку App_Data . Если файл Movies.mdf не отображается, нажмите кнопку Показать все файлы на панели инструментов Обозреватель решений, нажмите кнопку Обновить, а затем разверните папку App_Data.

Снимок экрана: окно Обозреватель решений. Папка App Data и вложенная папка Movies m d f обведены красным цветом.

Дважды щелкните Movies.mdf , чтобы открыть ОБОЗРЕВАТЕЛЬ СЕРВЕРА, а затем разверните папку Таблицы , чтобы просмотреть таблицу Movies. Обратите внимание на значок ключа рядом с идентификатором. По умолчанию EF делает свойство с именем ID первичным ключом. Дополнительные сведения о EF и MVC см. в отличном руководстве Тома Дайкстра по MVC и EF.

DB_explorer

Щелкните таблицу правой Movies кнопкой мыши и выберите Показать данные таблицы , чтобы просмотреть созданные данные.

Снимок экрана: окно Обозреватель сервера. Откроется контекстное меню Фильмы. Выбрано значение Show Table Data (Показать данные таблицы) и обведено красным цветом.

Снимок экрана: окно M V C Movie Microsoft Visual Studio. Выбрана вкладка d b o dot Movies Data (Данные фильмов).

Щелкните таблицу правой Movies кнопкой мыши и выберите Открыть определение таблицы , чтобы просмотреть структуру таблицы, созданную Entity Framework Code First.

Снимок экрана: окно Обозреватель сервера. Откроется контекстное меню Фильмы. Выбран пункт Open Table Definition (Открыть определение таблицы) и обведен красным цветом.

Снимок экрана, на котором показано окно Microsoft Visual Studio

Обратите внимание, что схема Movies таблицы сопоставляется с классом, созданным Movie ранее. Entity Framework Code First автоматически создал эту схему на основе вашего Movie класса.

По завершении закройте подключение, щелкнув правой кнопкой мыши MovieDBContext и выбрав Закрыть подключение. (Если вы не закроете подключение, при следующем запуске проекта может появиться сообщение об ошибке.

Снимок экрана: окно Обозреватель сервера. Откроется контекстное меню Movie D B. Флажок Закрыть подключение выбран и обведен красным цветом.

Теперь у вас есть база данных и страницы для отображения, редактирования, обновления и удаления данных. В следующем руководстве мы рассмотрим остальную часть кода с шаблонами и добавим SearchIndex метод и SearchIndex представление, которые позволяют искать фильмы в этой базе данных. Дополнительные сведения об использовании Entity Framework с MVC см. в статье Создание модели данных Entity Framework для ASP.NET приложения MVC.