Возможно ли создать повторно используемый Html.checkboxes для () помощника, совместимого с другими встроенными помощниками

#asp.net-mvc #checkbox #enums #html-helper #asp.net-core-3.1

#asp.net-mvc #флажок #перечисления #html-помощник #asp.net-core-3.1

Вопрос:

Я пытаюсь создать помощник HTML для отображения набора флажков для перечисления и привязать эти значения к a List<enum> в моей модели представления.

Большая часть этого прекрасна, мы можем использовать Enum.GetValues() для создания флажка для каждого значения в перечислении. например, для этого перечисления и модели представления:

 Enum Fruit {
    Apple,
    Banana
}

Class MyViewModel {
    public List<Fruit> Fruits { get; set; }
}
  

Мы можем сгенерировать это:

 <input id="Fruits_Apple" name="Fruits" type="checkbox" value="Apple">
<input id="Fruits_Banana" name="Fruits" type="checkbox" value="Banana">
  

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

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

В этом случае встроенные помощники Html будут повторно отображаться с использованием данных из ModelState (а не модели представления). Это также отлично работает с моим кодом, если установлен хотя бы один флажок в наборе. Однако, когда флажки не установлены, в браузер для этого поля ничего не отправляется, и поэтому ModelState для поля Fruits нет значения, поэтому помощник возвращается к данным модели представления (которые могут не соответствовать тому, что только что выбрал пользователь).

Встроенный CheckboxFor() метод позволяет обойти это, включив в скрытое поле значение false на странице. Это означает, что ModelState всегда содержит по крайней мере false значение, а иногда и a false , и a true . Когда присутствуют оба значения, связыватель модели устанавливает значение для модели представления в true.

Я попытался добавить скрытое поле в свой список флажков:

 <input id="Fruits_Apple" name="Fruits" type="checkbox" value="Apple">
<input id="Fruits_Banana" name="Fruits" type="checkbox" value="Banana">
<input name="Fruits" type="hidden" value="hidden_checkbox_dummy_value">
  

Это гарантирует, что всегда есть ModelState , однако ModelBinder не может сопоставить hidden_checkbox_dummy_value значение Fruit , поэтому мы получаем исключение.

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

Подтверждение того, что пользовательская привязка модели будет / не будет работать, или другие предложения о дальнейших действиях будут оценены.

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