Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将多个单选按钮绑定到单个布尔值_C#_Asp.net Mvc_Razor - Fatal编程技术网

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>