Работа со сложными моделями

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

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

В прошлом разделе мы создали две модели 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>

Ну и удаление производится также, как и в случае с обычной моделью.

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