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

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

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

В предыдущей теме мы создали две модели Player и Team и вывели элементы из таблицы 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");
}

Первый метод обрабатывает 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.

Редактирование модели

Редактирование работает подобным способом. Определим в контроллере следующее действие Edit:

[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