C# 将多个单选按钮绑定到单个布尔值
背景 我有一个包含三个布尔的模型C# 将多个单选按钮绑定到单个布尔值,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,背景 我有一个包含三个布尔的模型 public class PageDataModel { public bool setting1 { get; set; } public bool setting2 { get; set; } public bool setting3 { get; set; } } 如果一个值为true,则其他值必须为false 在我看来,我显示了三个单选按钮: 我的观点的Razor代码: <div class="row">
public class PageDataModel
{
public bool setting1 { get; set; }
public bool setting2 { get; set; }
public bool setting3 { get; set; }
}
如果一个值为true,则其他值必须为false
在我看来,我显示了三个单选按钮:
我的观点的Razor代码:
<div class="row">
<div class="radio">
@if (Model.Setting1)
{
@Html.RadioButtonFor(m => m.Setting1, "Setting1", new { Checked = "checked", Name = "Group"})
}
else
{
@Html.RadioButtonFor(m => m.Setting1, "Setting1", new { Name = "Group"})
}
@Html.Label("Setting1")
</div>
<div class="radio">
@if (Model.Setting2)
{
@Html.RadioButtonFor(m => m.Setting2, "Setting2", new { Checked = "checked", Name = "Group" })
}
else
{
@Html.RadioButtonFor(m => m.Setting2, "Setting2", new { Name = "Group"})
}
@Html.Label("Setting2")
</div>
<div class="radio">
@if (Model.Setting3)
{
@Html.RadioButtonFor(m => m.Setting3, "Setting3", new { Checked = "checked", Name = "Group" })
}
else
{
@Html.RadioButtonFor(m => m.Setting3, "Setting3", new { Name = "Group"})
}
@Html.Label("Setting3")
</div>
<button type="submit" class="btn btn-default">Save</button>
</div>
此操作正常,页面加载时已选中“设置1”单选按钮
问题
当我提交表单时,发布的模型包含所有假值,不管选中了哪个单选按钮
我尝试将值从“setting1”更改为true/false,但这对返回的数据没有影响
我相当确定我没有正确设置绑定,但我不确定哪里出了问题
我发现的所有其他示例都是将两个单选按钮绑定到一个bool值(例如,一对是/否单选按钮绑定到一个bool)。我可以将代码更改为使用一个int属性,但我想使用bools来解决这个问题
我做错了什么?我是否在这里误用了单选按钮?从技术上讲,只要将值设置为
true
,就可以正常工作。例如:
@Html.RadioButtonFor(m => m.setting1, true)
这样,如果选择了收音机,它将显示true
然而,这里无法克服的问题是,这不是收音机的设计功能。收音机是组的一部分,由name
属性的值决定。这会导致选择一个收音机时取消选择具有相同名称
属性的所有收音机。不过,使用radiobutton for
,将根据属性名称为每个收音机指定不同的名称。换句话说,你最终会得到:
<input type="radio" id="setting1" name="setting1" value="true" />
<input type="radio" id="setting2" name="setting2" value="true" />
<input type="radio" id="setting3" name="setting3" value="true" />
那么,在你看来:
<div class="radio">
<label>
@Html.RadioButtonFor(m => m.SelectedSetting, "setting1")
@Html.DisplayNameFor(m => m.setting1)
</label>
</div>
<div class="radio">
<label>
@Html.RadioButtonFor(m => m.SelectedSetting, "setting2")
@Html.DisplayNameFor(m => m.setting2)
</label>
</div>
<div class="radio">
<label>
@Html.RadioButtonFor(m => m.SelectedSetting, "setting3")
@Html.DisplayNameFor(m => m.setting3)
</label>
</div>
@Html.RadioButton(m=>m.SelectedSetting,“setting1”)
@DisplayNameFor(m=>m.setting1)
@Html.RadioButton(m=>m.SelectedSetting,“setting2”)
@DisplayNameFor(m=>m.setting2)
@Html.RadioButton(m=>m.SelectedSetting,“setting3”)
@DisplayNameFor(m=>m.setting3)
现在,所有收音机都将分组为“SelectedSetting”,并将发送到
SelectedSetting
属性。该属性上的自定义getter和setter可确保在实际的settingX
属性上设置正确的布尔值。一个属性只有一个单选按钮没有意义。您需要为每个属性设置两个单选按钮,一个带有value=“true”
,另一个带有value=“false”
(如果块,请删除所有)@Html.radiobutton(m=>m.Setting1,true)@Html.radiobutton(m=>m.Setting1,false)
我很确定我在这里使用了错误的控件,我只是想看看能不能用这种方法解决。单选按钮被选中或未选中(真/假),这在当时对我来说是有意义的。如果块有点凌乱,但这仍然处于PoC阶段。一旦我开始工作,我会把它们整理好。你所有的属性都是假的原因是你的单选按钮有value=“Setting1”
,value=“Setting2”
等,它们不能绑定到bool
,所以这些值是它们的默认值(false
)。如果选中,是否有方法将值绑定到?radiobutton()
方法会自动执行此操作。根据我之前评论中的代码,如果值为true
将选中第一个按钮,否则将选中第二个按钮。我决定重构代码以使用int值(实现起来更容易/更清晰),但这回答了最初的问题。谢谢也许是个好主意。我想展示如何做到这一点,但将属性名称硬编码为字符串使其成为一个非常脆弱的解决方案。使用nameof
将使其不那么脆弱<代码>案例“设置1”:
->案例名称(PageDataModel.setting1):
等
<input type="radio" id="setting1" name="setting" value="true" />
<input type="radio" id="setting2" name="setting" value="true" />
<input type="radio" id="setting3" name="setting" value="true" />
public class PageDataModel
{
public bool setting1 { get; set; }
public bool setting2 { get; set; }
public bool setting3 { get; set; }
public string SelectedSetting
{
get
{
if (setting1) return "setting1";
if (setting2) return "setting2";
if (setting3) return "setting3";
return null; // or you can set a default here
}
set
{
switch (value)
{
case "setting1":
setting1 = true;
break;
case "setting2":
setting2 = true;
break;
case "setting3":
setting3 = true;
break;
}
}
}
}
<div class="radio">
<label>
@Html.RadioButtonFor(m => m.SelectedSetting, "setting1")
@Html.DisplayNameFor(m => m.setting1)
</label>
</div>
<div class="radio">
<label>
@Html.RadioButtonFor(m => m.SelectedSetting, "setting2")
@Html.DisplayNameFor(m => m.setting2)
</label>
</div>
<div class="radio">
<label>
@Html.RadioButtonFor(m => m.SelectedSetting, "setting3")
@Html.DisplayNameFor(m => m.setting3)
</label>
</div>