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


Доступ к данным модели из контроллера с помощью шаблона представления

Рик Андерсон

Примечание

Здесь доступна обновленная версия этого руководства, использующая ASP.NET MVC 5 и Visual Studio 2013. Это более безопасно, гораздо проще следовать и демонстрирует больше функций.

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

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

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

  • Имя контроллера: MoviesController. (Это значение по умолчанию. )
  • Шаблон: контроллер MVC с действиями чтения и записи и представлениями с использованием Entity Framework.
  • Класс модели: Movie (MvcMovie.Models).
  • Класс контекста данных: MovieDBContext (MvcMovie.Models).
  • Представления: Razor (CSHTML). (Значение по умолчанию.)

AddScaffoldedMovieController

Нажмите кнопку Добавить. Visual Studio Express создает следующие файлы и папки:

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

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

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

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

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

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

Снимок экрана: страница создания фильма M V C.

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

IndexWhenHarryMet

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

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

Откройте файл 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());
    }

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

private MovieDBContext db = new MovieDBContext();

Запрос к контроллеру Movies возвращает все записи в Movies таблице базы данных фильмов, а затем передает результаты в Index представление.

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

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

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

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

public ActionResult Details(int id = 0)
{
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    return View(movie);
}

Movie Если объект найден, экземпляр Movie модели передается в представление Сведений. Изучите содержимое файла Views\Movies\Details.cshtml .

Включив @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 список из контроллера в представление:

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

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

@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", { id=item.ID })  |
            @Html.ActionLink("Delete", "Delete", { 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.

Снимок экрана: окно Обозреватель решений. Значок Показать все файлы обведен красным цветом и выбрана папка Данных приложения.

Дважды щелкните Movies.mdf , чтобы открыть ОБОЗРЕВАТЕЛЬ БАЗ ДАННЫХ, а затем разверните папку Таблицы , чтобы просмотреть таблицу Movies.

DB_explorer

Примечание

Если обозреватель базы данных не отображается, в меню СЕРВИС выберите Подключиться к базе данных, а затем отмените диалоговое окно Выбор источника данных . Это приведет к принудительному открытию обозревателя баз данных.

Примечание

Если вы используете VWD или Visual Studio 2010 и получаете сообщение об ошибке следующего вида:

  • База данных 'C:\Webs\MVC4\MVCMOVIE\MVCMOVIE\APP_DATA\MOVIES. Невозможно открыть MDF, так как это версия 706. Этот сервер поддерживает версию 655 и более ранние версии. Переход на предыдущую версию не поддерживается.
  • "InvalidOperation Exception was unhandled by user code" The предоставленный SqlConnection не указывает исходный каталог.

Необходимо установить SQL Server Data Tools и LocalDB. Проверьте строку подключения, MovieDBContext указанную на предыдущей странице.

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

Снимок экрана, на котором показана вкладка данных d b o dot Movies.

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

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

Снимок экрана, на котором показана вкладка

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

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

Снимок экрана: окно Обозреватель базы данных. В контекстном меню Movie D B щелкните правой кнопкой мыши пункт Закрыть подключение.

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