#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, чтобы игнорировать фиктивное значение, но для этого потребовалось достаточно исследований, и я думаю, что этот вопрос все еще может быть полезен другим в будущем.
Подтверждение того, что пользовательская привязка модели будет / не будет работать, или другие предложения о дальнейших действиях будут оценены.
Пожалуйста, обратите внимание, что добавление дополнительного значения к перечислению не является решением, которое я могу использовать, поскольку это делает повторное использование слишком беспорядочным.