Передача модели со списком флажков из вида в контроллер - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь передать модель из View обратно в контроллер.Я передаю NaborViewModel для просмотра.Это список объектов, и каждый объект имеет 4 флажка (некоторые из них проверены случайным образом).

Модель:

public class NaborViewModel
{
    public List<WowClass> WowClasses { get; set; }
}

Действия:

    [HttpGet]
    public ActionResult Nabor()
    {
        NaborViewModel viewModel = new NaborViewModel();
        DatabaseDataContext context = new DatabaseDataContext();
        viewModel.WowClasses = context.WowClasses.ToList();

        return View(viewModel);
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Nabor(NaborViewModel model)
    {
        //DB actions
        return RedirectToAction(Consts.ActionNabor);
    }

В поле зренияУ меня есть 2 формы, каждая с разным подходом.Первый - тот, который я создал с мыслью, что он может сработать.Вторая форма - подход, который я нашел онлайн.Первый отображает переданные данные правильно (заполненные флажки).Второй даже показывает все чекбоксы без проверки.Когда формы отправлены, они обе возвращают ноль обратно в действие контроллера.

Просмотр:

        @using (Html.BeginForm(Consts.ActionNabor, Consts.ControllerAdmin, FormMethod.Post))
        {
            @Html.AntiForgeryToken()
            <table class="admin-table">
                <thead>
                    <tr>
                        <th>Class</th>
                        <th>Status</th>
                        <th colspan="3">Požadované talenty</th>
                    </tr>
                </thead>
                <tbody>
                    @foreach (var cls in Model.WowClasses)
                    {
                        <tr>
                            @Html.HiddenFor(x => cls.Id)
                            <td>@cls.ClassName</td>
                            <td>@Html.CheckBoxFor(x => cls.Open)</td>
                            <td style="text-align: left">@Html.CheckBoxFor(x => cls.NeedTalents1) <span>@cls.Talents1</span></td>
                            <td style="text-align: left">@Html.CheckBoxFor(x => cls.NeedTalents2) <span>@cls.Talents2</span></td>
                            <td style="text-align: left">@Html.CheckBoxFor(x => cls.NeedTalents3) <span>@cls.Talents3</span></td>
                        </tr>
                    }
                </tbody>
            </table>

            <input type="submit" value="@Consts.Submit" />
        }

        <div class="horizontal-line-both"></div>

        @using (Html.BeginForm(Consts.ActionNabor, Consts.ControllerAdmin, FormMethod.Post))
        {
            @Html.AntiForgeryToken()
            <table class="admin-table">
                <thead>
                    <tr>
                        <th>Class</th>
                        <th>Status</th>
                        <th colspan="3">Požadované talenty</th>
                    </tr>
                </thead>
                <tbody>
                    @for (int i = 0; i < Model.WowClasses.Count; i++)
                    {
                        <tr>
                            <td>
                                <input type="text" value="@Model.WowClasses[i].ClassName" name="Expense[@i].Id">
                            </td>
                            <td>
                                <input type="checkbox" value="@Model.WowClasses[i].Open" name="Expense[@i].Id">
                            </td>
                            <td>
                                <input type="checkbox" value="@Model.WowClasses[i].NeedTalents1" name="Expense[@i].Id">
                            </td>
                            <td>
                                <input type="checkbox" value="@Model.WowClasses[i].NeedTalents2" name="Expense[@i].Id">
                            </td>
                            <td>
                                <input type="checkbox" value="@Model.WowClasses[i].NeedTalents3" name="Expense[@i].Id">
                            </td>
                            <td>
                                <input type="hidden" value="@i" name="Expense[@i].Id">
                            </td>
                        </tr>
                    }
                </tbody>
            </table>

            <input type="submit" value="@Consts.Submit" />
        }

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Я получил это для работы с комбинацией двух ваших подходов. Смотрите следующее:

@for (int i = 0; i < Model.WowClasses.Count; i++)
{
    ...
    <tr>
        @Html.EditorFor(model => model.WowClasses[i].Open)
    </tr>
    ...
}

Ключевым является доступ к каждому элементу вашего List через его индекс. Если вы посмотрите на HTML, сгенерированный с помощью этого метода, имя каждого элемента включает в себя его индекс (в приведенном выше примере имя сгенерированного ввода выглядит так: name="WowClasses[0].Open"). Вот как ваш контроллер может различать элементы списка.

0 голосов
/ 03 июля 2019

Для вашей второй формы вы можете изменить каждое поле ввода, например,

для флажка,

<input type="checkbox" id="WowClasses_@(i)_Open" name="WowClasses[@i].Open" value="true" />

для поля ввода,

<input type="checkbox" id="WowClasses_@(i)_ClassName" name="WowClasses[@i].ClassName" value="true" />

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...