gpt4 book ai didi

c# - 将多个单选按钮绑定(bind)到单个 bool 值

转载 作者:太空狗 更新时间:2023-10-30 01:16:10 24 4
gpt4 key购买 nike

背景

我有一个包含三个 bool 值的模型

public class PageDataModel
{
public bool setting1 { get; set; }
public bool setting2 { get; set; }
public bool setting3 { get; set; }
}

如果一个值为真,则其他值一定为假。

在我看来,我显示了三个单选按钮:

Enter image description here

我的 View 的 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>

在我的 Controller 中,我返回一个模型,其中 setting1 设置为 true:

var model = new PageDataModel
{
Setting1 = true,
Setting2 = false,
Setting3 = false
};
return View(model);

这工作正常,页面加载时选中了“设置 1”单选按钮。

问题

当我提交表单时,无论选中哪个单选按钮,发布的模型都包含所有错误值。

我尝试将值从“setting1”更改为 true/false,但这对返回的数据没有影响。

我很确定我没有正确设置绑定(bind),但我不确定哪里出错了。

我发现的所有其他示例都是将两个单选按钮绑定(bind)到一个 bool 值(例如,一对是/否单选按钮绑定(bind)到一个 bool 值)。我可以更改代码以使用一个 int 属性,但我想使用 bool 来解决这个问题。

我做错了什么?我在这里滥用单选按钮吗?

最佳答案

从技术上讲,只要您将值设置为 true,这就可以正常工作。例如:

@Html.RadioButtonFor(m => m.setting1, true)

这样,如果选择了 radio ,它将发布 true

然而,这里无法克服的问题是,这不是 radio 的设计功能。 radio 是组的一部分,由 name 属性的值确定。这会导致选择一个 radio 取消选择具有相同 name 属性的所有 radio 。但是,使用 RadioButtonFor 会根据属性名称为每个 radio 赋予不同的名称。换句话说,你最终会得到:

<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" />

然后,每个 radio 将属于不同的组,每个 radio 仅由一个 radio 组成(这意味着默认情况下将选择每个 radio )。您可以覆盖名称属性,但发布的值将不再绑定(bind)到实际属性。例如,如果您有:

<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" />

这样它们现在都属于同一个 radio 组,该值将发布到 setting 并且它始终为真。

总而言之,没有办法让这项工作像这样进行。您可以做的是使用另一个属性代理该值。

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>

现在, radio 将全部分组为“SelectedSetting”,并将发布到 SelectedSetting 属性。该属性上的自定义 getter 和 setter 可确保在实际的 settingX 属性上设置正确的 bool 值。

关于c# - 将多个单选按钮绑定(bind)到单个 bool 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36177782/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com