Как связать список объектов в ASP.NET Core MVC, когда публикуемый список меньше исходного? - PullRequest
0 голосов
/ 28 марта 2019

Использование атрибута «disabled» на входах в форме не публикует их, что ожидается и желательно Однако, если вы подготовите форму из 3 объектов в списке, отключите первый и третий и отправите, второй объект появится в заголовке сообщения, но не будет правильно привязан к списку, поскольку у него есть индекс [1] вместо [0].

Я понимаю, как работает привязка модели и почему она не связывает опубликованный объект, который я хочу, но я не знаю, как еще описать проблему, чтобы получить конкретные результаты, которые привели бы меня к моему решению. Все, что я ищу, приводит к основным постам и обязательным примерам.

Список внутри модели, которую я использую:

public IList<_Result> Results { get; set; }

Класс _Result имеет одно из свойств:

public string Value { get; set; }

Я заполняю список и использую его так:

@for (int i = 0; i < Model.Results.Count; i++)
{
    ...
    <td>
        <input asp-for="Results[i].Value" disabled />
    </td>
    ...
}

У меня есть флажки в форме, которые убирают (с помощью javascript) атрибут «disabled» из входных данных и, таким образом, позволяют их публиковать.

Когда я заполняю указанный список 3 объектами _Result, они отображаются в форме и все имеют атрибут «disabled». Если я удаляю атрибут «disabled» из первых двух объектов и нажимаю кнопку «Отправить», я получаю список результатов с первыми двумя объектами _Result, что соответствует ожиданиям.

Однако, если я удаляю атрибут «disabled» только из второго объекта _Result (первый объект _Result по-прежнему имеет атрибут «disabled»), список результатов возвращается пустым в моем методе Controller. В моем заголовке данных формы я вижу следующее: «Results [1]. Значение: значение, которое я хочу опубликовать», что означает, что публикация происходит, но список не связывает объект из-за индекса.

Есть идеи о том, как я могу добиться этого правильного связывания? Кроме того, причина, по которой я использую атрибут «disabled», заключается в том, что я показываю много результатов на одной странице и хочу публиковать только те, которые выбраны.

1 Ответ

0 голосов
/ 29 марта 2019

Для получения выбранных элементов вы можете попробовать установить флажок с View Model вместо использования jquery для управления свойством disable.

  1. Изменить ViewModel

    public class ModelBindVM
    {
        public IList<_ResultVM> Results { get; set; }
    }
    public class _ResultVM
    {
        public bool IsSelected { get; set; }
        public string Value { get; set; }
    }
    
  2. Контроллер

    [HttpGet]
    public IActionResult ModelBindTest()
    {
        ModelBindVM model = new ModelBindVM
        {
            Results = new List<_ResultVM>() {
                new _ResultVM{ Value = "T1" },
                new _ResultVM{ Value = "T2" },
                new _ResultVM{ Value = "T3" }
            }
        };
        return View(model);
    }
    [HttpPost]
    public IActionResult ModelBindTest(ModelBindVM modelBind)
    {
        return View();
    }
    
  3. Просмотр

    <div class="row">
        <div class="col-md-4">
            <form asp-action="ModelBindTest">
                @for (int i = 0; i < Model.Results.Count; i++)
                {
                    <input type="checkbox" asp-for="Results[i].IsSelected" />
                    <label asp-for="@Model.Results[i].IsSelected">@Model.Results[i].Value</label>
                    <input type="hidden" asp-for="@Model.Results[i].Value" />
                }
                <div asp-validation-summary="ModelOnly" class="text-danger"></div>
                <div class="form-group">
                    <input type="submit" value="Save" class="btn btn-primary" />
                </div>
            </form>
        </div>
    </div>
    
...