Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
В прошлом разделе мы создали две модели Player и Team и вывели элементы из таблицы Players на страницу. Теперь посмотрим, как проделать остальные операции с моделями - редактирование, удаление, добавление. Эти действия не сильно отличаются от логики работы с простыми моделями. Единственное отличие - мы должны учитывать навигационное свойство, имеющееся в сложной модели.
Рассмотрим логику добавления модели Player в таблицу Players. Вначале пропишем в контроллере следующее действие Create:
[HttpGet] public ActionResult Create() { // Формируем список команд для передачи в представление SelectList teams = new SelectList(db.Teams, "Id", "Name"); ViewBag.Teams = teams; return View(); } [HttpPost] public ActionResult Create(Player player) { //Добавляем игрока в таблицу db.Players.Add(player); db.SaveChanges(); // перенаправляем на главную страницу return RedirectToAction("Index"); }
Первый вариант действия Create обрабатывает GET-запрос и выдает представление, передавая в него объект SelectList - список всех команд.
Второй вариант действия получает введенную пользователем в представлении модель и добавляет ее в БД. Рассмотрим само представление Create.cshtml:
@model NavigationProperty.Models.Player @{ ViewBag.Title = "Добавление игрока"; Layout = "~/Views/Shared/_Layout.cshtml"; } <h2>Добавление нового игрока</h2> @using (Html.BeginForm()) { <fieldset> <legend>Футболист</legend> <p> Имя игрока <br /> @Html.EditorFor(model => model.Name) </p> <p> Возраст <br /> @Html.EditorFor(model => model.Age) </p> <p> Позиция на поле <br /> @Html.EditorFor(model => model.Position) </p> <p> Команда <br /> @Html.DropDownListFor(model => model.TeamId, ViewBag.Teams as SelectList) </p> <p> <input type="submit" value="Добавить игрока" /> </p> </fieldset> } <div> @Html.ActionLink("К списку игроков", "Index") </div>
Как и в случае с простыми моделями, мы привязываем поля к определенному свойству.
Тут следует лишь отметить создание выпадающего списка, из которого мы выбираем команду. Выбираемое значение в этом списке привязывается к свойству модели TeamId.
Редактирование работает подобным способом. Определим в контроллере действия, которые отвечают за редактирование:
[HttpGet] public ActionResult Edit(int? id) { if (id == null) { return HttpNotFound(); } // Находим в бд футболиста Player player = db.Players.Find(id); if (player != null) { // Создаем список команд для передачи в представление SelectList teams = new SelectList(db.Teams, "Id", "Name", player.TeamId); ViewBag.Teams = teams; return View(player); } return RedirectToAction("Index"); } [HttpPost] public ActionResult Edit(Player player) { db.Entry(player).State = EntityState.Modified; db.SaveChanges(); return RedirectToAction("Index"); }
Здесь мы также формируем список команд, которые мы получаем из БД, в объекте SelectList. И после получения запроса на редактирование определенной модели Player контроллер передает эту модель и список команд в представление Edit.cshtml:
@model NavigationProperty.Models.Player @{ ViewBag.Title = "Edit"; Layout = "~/Views/Shared/_Layout.cshtml"; } <h2>Изменение игрока</h2> @using (Html.BeginForm()) { <fieldset> <legend>Футболист</legend> @Html.HiddenFor(model => model.Id) <p> Имя игрока <br /> @Html.EditorFor(model => model.Name) </p> <p>Возраст <br /> @Html.EditorFor(model => model.Age) </p> <p>Позиция на поле <br /> @Html.EditorFor(model => model.Position) </p> <p>Команда <br /> @Html.DropDownListFor(model => model.TeamId, ViewBag.Teams as SelectList) </p> <p> <input type="submit" value="Сохранить" /> </p> </fieldset> } <div> @Html.ActionLink("Вернуться к списку футболистов", "Index") </div>
Ну и удаление производится также, как и в случае с обычной моделью.