Форма публикации с коллекцией объектов - PullRequest
0 голосов
/ 22 октября 2018

Мне нужно загрузить форму, которая содержит несколько списков выбора одного типа.

Форма выглядит следующим образом

enter image description here

Просмотр

<form asp-action="UpdateFilter" asp-controller="Home" method="post">

                @for (int i = 0; i < Model.FilterRows.Count(); i++)
                {
                    <div class="form-inline" style="margin-top:5px">

                        <select class="form-control form-control-sm">
                            @for (int i2 = 0; i2 < Model.FilterRows[i].FilterOptions.Count(); i2++)
                            {
                                <option name="FilterRows[@i].FilterOptions[@i2]"
                                        value="@Model.FilterRows[i].FilterOptions.ToArray()[i2].Value">@Model.FilterRows[i].FilterOptions.ToArray()[i2].Text</option>
                            }
                        </select>

                        <select class="form-control form-control-sm" style="margin-left: 5px">
                            @for (int i3 = 0; i3 < Model.FilterRows[i].FilterOperators.Count(); i3++)
                            {
                                <option name="FilterRows[@i].FilterOperators[@i3]"
                                        value="@Model.FilterRows[i].FilterOperators.ToArray()[i3].Value">@Model.FilterRows[i].FilterOperators.ToArray()[i3].Text</option>
                            }
                        </select>

                        <input type="text" class="form-control form-control-sm" style="margin-left: 5px" />
                    </div>
                }

                <button class="btn btn-primary btn-sm" style="margin-top: 15px;">Apply</button>
            </form>

Выход HTML

<form method="post" action="/Home/UpdateFilter">

    <div class="form-inline" style="margin-top:5px">

        <select class="form-control form-control-sm">
            <option name="FilterRows[0].FilterOptions[0]" value=""></option>
            <option name="FilterRows[0].FilterOptions[1]" value="1">Column 1</option>
            <option name="FilterRows[0].FilterOptions[2]" value="2">Column 2</option>
            <option name="FilterRows[0].FilterOptions[3]" value="3">Column 3</option>
            <option name="FilterRows[0].FilterOptions[4]" value="4">Column 4</option>
        </select>

        <select class="form-control form-control-sm" style="margin-left: 5px">
            <option name="FilterRows[0].FilterOperators[0]" value=""></option>
            <option name="FilterRows[0].FilterOperators[1]" value="1">Like</option>
            <option name="FilterRows[0].FilterOperators[2]" value="2">&gt;</option>
            <option name="FilterRows[0].FilterOperators[3]" value="3">=</option>
            <option name="FilterRows[0].FilterOperators[4]" value="4">&lt;</option>
        </select>

        <input type="text" class="form-control form-control-sm" style="margin-left: 5px">
    </div>


    <div class="form-inline" style="margin-top:5px">

        <select class="form-control form-control-sm">
            <option name="FilterRows[1].FilterOptions[0].Value" value=""></option>
            <option name="FilterRows[1].FilterOptions[1].Value" value="1">Column 1</option>
            <option name="FilterRows[1].FilterOptions[2].Value" value="2">Column 2</option>
            <option name="FilterRows[1].FilterOptions[3].Value" value="3">Column 3</option>
            <option name="FilterRows[1].FilterOptions[4].Value" value="4">Column 4</option>
        </select>

        <select class="form-control form-control-sm" style="margin-left: 5px">
            <option name="FilterRows[1].FilterOperators[0].Text" value=""></option>
            <option name="FilterRows[1].FilterOperators[1].Text" value="1">Like</option>
            <option name="FilterRows[1].FilterOperators[2].Text" value="2">&gt;</option>
            <option name="FilterRows[1].FilterOperators[3].Text" value="3">=</option>
            <option name="FilterRows[1].FilterOperators[4].Text" value="4">&lt;</option>
        </select>

        <input type="text" class="form-control form-control-sm" style="margin-left: 5px">
    </div>


    <button class="btn btn-primary btn-sm" style="margin-top: 15px;">Apply</button>

    </div>
</form>

Контроллер

[HttpPost]
        public JsonResult UpdateFilter(ModalFilterViewModel model)
        {
            return Json(new { success = 1 });
        }

ViewModel

public class ModalFilterViewModel
    {
        public IList<FilterRow> FilterRows { get; set; }
    }

public class FilterRow
    {
        public int? Id { get; set; }

        public SelectList FilterOptions { get; set; }
        public int? FilterOptionId { get; set; }

        public SelectList FilterOperators { get; set; }
        public int? FilterOperatorId { get; set; }

        public string SearchValue { get; set; }
    }

Проблема заключается в том, что после отправки формы (нажатия кнопки) загруженная ViewModel пуста.Почему это так и как я могу это исправить?

enter image description here

1 Ответ

0 голосов
/ 22 октября 2018

Основная ошибка заключалась в том, что я назначал атрибут name в тег option, а не в тег select.Поэтому данные не были отправлены в действие контроллера.Наконец я в конечном итоге с этим решением.

<form asp-controller="Home" asp-action="UpdateFilter" method="POST">

                @for (int i = 0; i < Model.FilterRows.Count(); i++)
                {
                    <div class="form-inline" style="margin-top:5px">

                        <input type="hidden" name="FilterRows[@i].Id" value="@i" />

                        <select asp-for="@Model.FilterRows[i].FilterOptionId"
                                asp-items="@Model.FilterRows[i].FilterOptions"
                                class="form-control form-control-sm"></select>

                        <select asp-for="@Model.FilterRows[i].FilterOperatorId"
                                asp-items="@Model.FilterRows[i].FilterOperators"
                                class="form-control form-control-sm"
                                style="margin-left: 5px"></select>

                        <input type="text" 
                                asp-for="@Model.FilterRows[i].SearchValue" 
                                class="form-control form-control-sm" 
                                style="margin-left: 5px" />
                    </div>
                }

                <button type="submit" class="btn btn-primary btn-sm" style="margin-top: 15px;">Apply</button>

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