Как предотвратить множественный выбор переключателя Razor control в mvc?

У меня есть переключатель для опции Мужской и Женский, но проблема в том, что они оба выбраны вместо любого.

Мой контроллер:

 private List<SelectedGenderModel> GetGender()
        {
            var gender = new List<SelectedGenderModel>();
            gender.Add(new SelectedGenderModel { Name = "Male", Id = 1, Selected = false });
            gender.Add(new SelectedGenderModel { Name = "Female", Id = 2, Selected = false });
            return gender;
        }

Мой взгляд:

@model MvcDemo.Models.EmployeeModel
 @for (int i = 0; i < Model.Gender.Count; i++)
                {
                    @Html.RadioButtonFor(m => m.Gender[i].Selected, new { id = "gender_" + i, name = "gendernm_" })
                    @Html.HiddenFor(m => m.Gender[i].Id)
                    @Html.HiddenFor(m => m.Gender[i].Name)
                    @Html.DisplayFor(m => m.Gender[i].Name)
                }

Моя модель просмотра:

public class EmployeeModel
    {
            public int Id { get; set; }
            public string Fullname { get; set; }
            public List<SelectedGenderModel> Gender { get; set; }
    }

Моя модель данных:

public partial class EmployeeMaster
    {
        public int Id { get; set; }
        public string Fullname { get; set; }
        public Nullable<bool> Gender { get; set; }
    }

Так как я могу предотвратить множественный выбор переключателя?

1 ответ

Решение

Ваш цикл отображает 2 переключателя с разными именами (name="Gender[0].Selected" а также name="Gender[1].Selected"), что означает, что они принадлежат к 2 различным группам. Вы можете думать, что new { name = "gendernm_" } модифицирует name атрибут, но, к счастью, это не так (в противном случае привязка модели потерпит неудачу при обратной публикации).

Непонятно, почему у вашей модели данных есть свойство bool? Gender (это значение true должен означать мужской или женский? и что делает null значение значит? возможно bool IsMale или же bool IsFemale может иметь больше смысла для кого-то другого, но почему бы просто не сделать это строкой (или перечислением)?

Измените модель представления на

public class EmployeeModel
{
  public int Id { get; set; }
  public string Fullname { get; set; }
  [Required]
  public string Gender { get; set; }
}

и в представлении

@Html.RadioButtonFor(m => m.Gender, "Male", new { id = "Male" })
<label for"Male">Male</label>
@Html.RadioButtonFor(m => m.Gender, "Female", new { id = "Female" })
<label for"Female">Female</label>
@Html.ValidationMessageFor(m => m.Gender)

Если вы хотите сделать это недействительным bool, то вы можете использовать

@Html.RadioButtonFor(m => m.Gender, "True", new { id = "Male" })
<label for"Male">Male</label>
@Html.RadioButtonFor(m => m.Gender, "False", new { id = "Female" })
<label for"Female">Female</label>
@Html.RadioButtonFor(m => m.Gender, "", new { id = "Unknown" })
<label for"Unknown">Not sure</label>
Другие вопросы по тегам