2015-02-23 66 views
2

我有男性和女性选项的单选按钮,但问题是他们都选择而不是任何一个。如何防止在mvc中多次选择Razor控件单选按钮?

我的控制器:

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; } 
    } 

那么我如何防止单选按钮的多选?

+0

在每个循环中,您只渲染一个单选按钮。他们在不同的群体!为什么你需要一个模型(而不是仅仅绑定到一个属性'字符串性别'与男性和女性2单选按钮)? – 2015-02-23 05:50:58

+0

我将存储0和1的性别,我已经创建了性别模型,根据选定的单选按钮获取选定的性别 – CodeScanner 2015-02-23 05:53:30

+0

然后包含一个属性'int Gender {get;组; }'并将2个单选按钮绑定到该属性(但为什么要使用'0'或'1'? - 使其成为字符串或枚举)。没有显示的代码是必要的。 – 2015-02-23 05:57:06

回答

1

您的循环渲染了2个具有不同名称的单选按钮(name="Gender[0].Selected"name="Gender[1].Selected"),这意味着它们属于2个不同的组。您可能会认为new { name = "gendernm_" }正在修改name属性,但幸运的是(否则模型绑定将在回发后失败)。

不清楚为什么你的数据模型具有财产bool? Gender(假定的true值是指男性还是女性?又是什么一个null值意味着什么?也许bool IsMalebool 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) 

如果你想让它可空布尔值,那么你可以使用

@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> 
+0

但你不觉得在表中存储男性或女性只是浪费存储 – CodeScanner 2015-02-23 06:29:57

+0

你的解决方案是好的,但在这里你已经写了两个时间单选按钮,因为你知道有2个选项,即男性和女性。但如果值为单选按钮是从数据库then.like假设男性和女性来自数据库或从服务器端,如我在我的方法中显示,然后? – CodeScanner 2015-02-23 06:33:14

+1

当然不是。它的意义不大(你总是可以使它成为'char(1)'并将值存储为“M”和“F”(2个字节)。可读性在这里非常重要,除了你自己以外, true'应该表示 – 2015-02-23 06:34:16