Скрытые поля ввода, извлекающие неверные данные - PullRequest
0 голосов
/ 23 января 2020

Это работает:

   @if (brandFilters.Count != 0) { 
            @for (var i = 0; i < brandFilters.Count(); i++)
            {
                <li>
                    <input asp-for="@brandFilters[i].Selected" class="form-check-input" onclick="this.form.submit();" />
                    <label asp-for="@brandFilters[i].Selected">@brandFilters[i].Text</label>
                    <input type="hidden" asp-for="@brandFilters[i].Value" />
                    <input type="hidden" asp-for="@brandFilters[i].Text" />
                </li>
            }    
        }

Это не работает:

 @if (colorFilters.Count != 0) { 
            @for (var i = 0; i < colorFilters.Count(); i++)
            {
                <li>
                    <input asp-for="@colorFilters[i].Selected" class="form-check-input" onclick="this.form.submit();" />
                    <label asp-for="@colorFilters[i].Selected">@colorFilters[i].Text</label>
                    <input type="hidden" asp-for="@colorFilters[i].Value" />
                    <input type="hidden" asp-for="@colorFilters[i].Text" />
                </li>
            }
        }

Смущен? Я тоже. Я использую ViewData, привязанный к контроллеру, для отправки списка «SelectListItem» для «Brand» и «Color». Оба списка заполнены. Бренд работает без нареканий. Он использует GUID для своей стоимости. Цвет, использует целое число для его значения. Это единственное отличие во всем. Начальная загрузка полных списков в порядке. Добавляя и удаляя бренды, корректно обновляет параметры цвета (удаляя их как выбранные элементы). Обратное верно. Выбор цвета при начальной загрузке удаляет параметры из выбора бренда. Разница здесь в том, что скрытые поля корректно обновляются для бренда, но скрытые поля остаются ПОСЛЕДОВАТЕЛЬНЫМИ для цветных флажков.

  <li>
                    <input class="form-check-input" onclick="this.form.submit();" type="checkbox" data-val="true" data-val-required="The Selected field is required." id="colorFilters_0__Selected" name="colorFilters[0].Selected" value="true" />
                    <label for="colorFilters_0__Selected">Gold</label>
                    <input type="hidden" id="colorFilters_0__Value" name="colorFilters[0].Value" value="1" />
                    <input type="hidden" id="colorFilters_0__Text" name="colorFilters[0].Text" value="Black" />
                </li>
                <li>
                    <input class="form-check-input" onclick="this.form.submit();" type="checkbox" data-val="true" data-val-required="The Selected field is required." id="colorFilters_1__Selected" name="colorFilters[1].Selected" value="true" />
                    <label for="colorFilters_1__Selected">Red</label>
                    <input type="hidden" id="colorFilters_1__Value" name="colorFilters[1].Value" value="2" />
                    <input type="hidden" id="colorFilters_1__Text" name="colorFilters[1].Text" value="White" />
                </li>

Флажок и метка получают правильные данные. Правильное значение передается в ViewData контроллером и проверяется во время выполнения. Значения должны быть 6 и 7, красный и золотой. Не 1 и 2, черно-белое.

Этот код используется для построения списка SelectListItem:

ColorFilterListOutbound.Add(new SelectListItem { Text = item.Value, Value = item.ColorListId.ToString(), Selected = false });

Подводя итог: Все работает нормально, пока я не отправлю обратно что-либо кроме полный список цветных флажков. Часть данных (визуальная) обновляется нормально. Оба скрытых поля для каждого флажка принимают старые последовательные данные.

1 Ответ

0 голосов
/ 23 января 2020

При изменении количества предоставляемых флажков ModelState поддерживал список предыдущих флажков. Очистка ModelState решает немедленную проблему. Я посмотрю на манипуляции с ModelState, если это необходимо, но, похоже, очистка - это путь к go. Мне просто нужно повторно применить проверки, которые использовались ранее, для создания новых списков флажков.

...