Доступ к данным модели из контроллера с помощью шаблона представления
Примечание
Здесь доступна обновленная версия этого руководства, использующая ASP.NET MVC 5 и Visual Studio 2013. Это более безопасно, гораздо проще следовать и демонстрирует больше функций.
В этом разделе вы создадите класс MoviesController
и напишете код, который извлекает данные фильма и отображает их в браузере с помощью шаблона представления.
Выполните сборку приложения , прежде чем переходить к следующему шагу.
Щелкните правой кнопкой мыши папку Контроллеры и создайте новый MoviesController
контроллер. Приведенные ниже параметры не будут отображаться до тех пор, пока вы не создадите приложение. Выберите следующие параметры.
- Имя контроллера: MoviesController. (Это значение по умолчанию. )
- Шаблон: контроллер MVC с действиями чтения и записи и представлениями с использованием Entity Framework.
- Класс модели: Movie (MvcMovie.Models).
- Класс контекста данных: MovieDBContext (MvcMovie.Models).
- Представления: Razor (CSHTML). (Значение по умолчанию.)
Нажмите кнопку Добавить. 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
браузера . В результате будет пустой список фильмов, так как вы еще не добавили их.
Создание фильма
Щелкните ссылку Create New (Создать). Введите некоторые сведения о фильме и нажмите кнопку Создать .
Нажатие кнопки Создать приводит к тому, что форма будет опубликована на сервере, где сведения о фильме сохраняются в базе данных. Затем вы будете перенаправлены по 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());
}
Следующая строка из 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 в редакторе кода:
Работа с SQL Server LocalDB
Entity Framework Code First обнаружила, что предоставленная строка подключения к базе данных указывала на Movies
базу данных, которая еще не существует, поэтому Code First создал базу данных автоматически. Чтобы убедиться, что он создан, зайдите в папку App_Data . Если файл Movies.mdf не отображается, нажмите кнопку Показать все файлы на панели инструментов Обозреватель решений, нажмите кнопку Обновить, а затем разверните папку App_Data.
Дважды щелкните Movies.mdf , чтобы открыть ОБОЗРЕВАТЕЛЬ БАЗ ДАННЫХ, а затем разверните папку Таблицы , чтобы просмотреть таблицу Movies.
Примечание
Если обозреватель базы данных не отображается, в меню СЕРВИС выберите Подключиться к базе данных, а затем отмените диалоговое окно Выбор источника данных . Это приведет к принудительному открытию обозревателя баз данных.
Примечание
Если вы используете 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
кнопкой мыши и выберите Показать данные таблицы , чтобы просмотреть созданные данные.
Щелкните таблицу правой Movies
кнопкой мыши и выберите Открыть определение таблицы , чтобы просмотреть структуру таблицы, созданную Entity Framework Code First.
Обратите внимание, что схема Movies
таблицы сопоставляется с классом, созданным Movie
ранее. Entity Framework Code First автоматически создал эту схему на основе вашего Movie
класса.
По завершении закройте подключение, щелкнув правой кнопкой мыши MovieDBContext и выбрав Закрыть подключение. (Если вы не закроете подключение, при следующем запуске проекта может появиться сообщение об ошибке.
Теперь у вас есть база данных и простая страница со списком для отображения содержимого из нее. В следующем руководстве мы рассмотрим остальную часть сформированного кода и добавим SearchIndex
метод и SearchIndex
представление, которые позволяют искать фильмы в этой базе данных.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по