单选按钮适用于多个bool

时间:2015-06-24 07:44:39

标签: asp.net asp.net-mvc

假设我的模型中有以下属性,我想要互相排斥:

public bool PrintWeek1 {get; set;}
public bool PrintWeek2 {get; set;}
public bool PrintWeek3 {get; set;} 

是否可以将它们渲染为一组单选按钮,还是需要将它们更改为枚举?

如果我使用@Html.RadioButtonFor,则会将name作为属性的名称,因此它们的分组不正确。

2 个答案:

答案 0 :(得分:5)

这是一个快速解决方案,让您在模型中具有以下属性 -

public bool PrintWeek1 { get; set; }
public bool PrintWeek2 { get; set; }
public bool PrintWeek3 { get; set; }
public string SelectedValue { get; set; }

然后你的HTML应该是这样的 -

@Html.RadioButtonFor(Model => Model.PrintWeek1, "PrintWeek1", new { @Name = "SelectedValue" }) 
@Html.RadioButtonFor(Model => Model.PrintWeek2, "PrintWeek2", new { @Name = "SelectedValue" }) 
@Html.RadioButtonFor(Model => Model.PrintWeek3, "PrintWeek3", new { @Name = "SelectedValue" })

然后,当您提交表单时,您将在SelectedValue属性中获取所选值。

修改 要解决@StephenMuecke点,创建了以下解决方案 -

创建enum -

public enum PrintWeekType
{
    PrintWeek1, PrintWeek2, PrintWeek3
}

然后有一个模型属性(而不是单个属性,具有单个emum属性) -

public PrintWeekType SelectedValue { get; set; }

HTML应如下所示 -

@Html.RadioButtonFor(m => m.SelectedValue, PrintWeekType.PrintWeek1) 
@Html.RadioButtonFor(m => m.SelectedValue, PrintWeekType.PrintWeek2) 
@Html.RadioButtonFor(m => m.SelectedValue, PrintWeekType.PrintWeek3)

使用上面的示例,可以预先选择一个单选按钮,同时我们可以在SelectedValue属性中发布所选的值。

答案 1 :(得分:0)

好的,我放弃了bool,最后使用了一个列表 - 这似乎是最快捷,最简单的方法。

我初始化模型的地方:

   public PrintViewModel()
        {
            this.PrintTypes = new List<string>() { "Print Week 1", "Print Week 2", "Print Week 3" };
        }

    public List<string> PrintTypes { get; set; }
    public string SelectedPrintType { get; set; }

在我看来(我希望默认选择第一个选项):

   @for(int i = 0; i < Model.PrintTypes.Count; i++)
        {
            <div class="row">
                <div class="col-md-2">
                    @(i == 0 ? Html.RadioButtonFor(x => x.SelectedPrintType, Model.PrintTypes[i], new {@checked = "checked"}) : @Html.RadioButtonFor(x => x.SelectedPrintType, Model.PrintTypes[i]))
                    &nbsp;
                    <label for="@Model.PrintTypes[i]">@Model.PrintTypes[i]</label>
                </div>
            </div>
        }