Флажок с тремя значениями Razor MVC C#

#c# #asp.net-mvc #razor

#c# #asp.net-mvc #razor

Вопрос:

У меня есть модель, которую я привязываю к представлению, которое отлично работает для всех элементов моей модели, за исключением bool? Участники.

Мое представление — это, по сути, всплывающее окно с фильтром поиска, в котором пользователи могут либо выбрать фильтрацию наших записей по:

  • Имеет phone (они установят флажок в true)
  • У него нет телефона (они оставят флажок снятым)
  • Не имеет значения, делают они это или нет (вот почему мне нужен третий вариант для этого)

Технически элемент bool моей модели будет иметь либо true , false либо null

В моем коде, если пользователь не установил флажок, по умолчанию он установлен на false , если они ставят флажок, то он устанавливается на true

Как я могу подойти к этой проблеме?

@Html.LabelFor(m => m.hasphone, "Has Phone ", new { @class = "control-label" })
@Html.CheckBoxFor(m => hasphone, new { htmlAttributes = new { @class = "form-control", value = Model.id, @checked = false } })

Комментарии:

1. Вы можете использовать переключатели или создать свой собственный помощник, как показано здесь

2. вам нужно сделать ваше свойство обнуляемым. поставьте лайк public bool? HasPhone {get;set;} и затем установите значение в null

Ответ №1:

Это потому, что флажок или RadioButton, если уж на то пошло, имеют только два состояния: checked или unchecked.

в вашем описании кажется, что у него нет телефона или не имеет значения, оставьте флажок в любом случае, так зачем вам нужен третий вариант?

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

Комментарии:

1. Допустим, у нас есть 100 записей, 50 с телефоном и 50 без телефона, если он поставил галочку «Да с телефонами», то он получает 50, если он поставил галочку «Нет, только пожалуйста», тогда он получает 50. Если он хочет любой, то он получает 100

2. Есть 3 варианта, поэтому используйте переключатель.

3. Я бы использовал @Html.EditorFor(m=> m.HasPhone, новый { @class = «form-check-input», значение = m.HasPhone})

4. Да, переключатель, похоже, это то, что нужно, не знаю, почему я этого раньше не видел

Ответ №2:

Я, наконец, понял, как это сделать в Razor, на случай, если кто-нибудь застрянет

 @Html.LabelFor(m => m.hasphone, "Has Phone ", new { @class = "control-label" })
<fieldset id="hasphone">
     <label><input type="radio" name="hasphone" class="form-control" value="true" />Yes</label>
     <label><input type="radio" name="hasphone" class="form-control" value="false" />No</label>
     <label><input type="radio" name="hasphone" class="form-control" />Any</label>
</fieldset>
  

Идея состоит в том, чтобы создать группу, содержащую 3 параметра, назовите свою группу тем же именем, что и имя свойства <fieldset id="hasphone">

Затем установите для имени radiobutton значение имени группы name="hasphone" , и, наконец, первая переключающая кнопка будет иметь значение true, value="true" которое соответствует значению элемента модели true , false соответствует false

И, наконец, не устанавливая значение третьего переключателя, вы получаете нулевое значение