mvc bind / post boolean to radiobutton

时间:2010-05-06 19:48:09

标签: asp.net asp.net-mvc radio-button

我的模型中有一个列,其中有一个NULLABLE布尔值。现在在我的View(编辑)上,我想将它绑定到两个radiobuttons:Yes&不。如果值为null,则只需取消选中两个radiobutton。我该怎么做呢?

感谢。

4 个答案:

答案 0 :(得分:22)

选择单选按钮后,实际上无法取消选择(作为用户)。我建议如果你真的需要一个三值的结果,你有三个单选按钮 - 是的,不,不在乎。

<%= Html.LabelFor( m => m.Foo ) %>
<%= Html.RadioButtonFor( m => m.Foo, "true" ) %> Yes
<%= Html.RadioButtonFor( m => m.Foo, "false" ) %> No
<%= Html.RadioButtonFor( m => m.Foo, string.Empty ) %> Don't Care
<%= Html.ValidationMessageFor( m => m.Foo ) %>

答案 1 :(得分:3)

使用多个Html.RadioButtonFor(m =&gt; m.Foo,“true”)似乎会生成无效的HTML,因为它会生成具有相同ID的控件:

<input **id="Foo"** ... type="radio" value="True">
<input **id="Foo"** ... type="radio" value="False">

我已经通过在html中直接制作单选按钮解决了这个问题:

<input type="radio" name="Foo" value="true" id="Foo_True"
       <%:Html.WriteCheckedIfTrue(Model.Foo.HasValue && Model.Foo.Value)%>/>
       <label for="Foo_True">Yes</label><br/>

<input type="radio" name="Foo" value="false" id="Foo_False" 
       <%:Html.WriteCheckedIfTrue(Model.Foo.HasValue && !Model.Foo.Value)%>/> 
       <label for="Foo_False">No</label><br/>

<input type="radio" name="Foo" value="" id="Foo_Null" 
       <%:Html.WriteCheckedIfTrue(!Model.Foo.HasValue)%>/> 
       <label for="Foo_Null">Don't Care</label>

确保根据使用的viewmodel命名单选按钮,例如:Model.Filter.HasImage命名为:Filter.HasImage用于模型绑定

“html helper”如下所示:

    public static MvcHtmlString WriteCheckedIfTrue(this HtmlHelper htmlHelper, 
                                                   bool validation)
    {
        if(validation)
            return new MvcHtmlString("checked=\"checked\"");

        return new MvcHtmlString(string.Empty);
    }

答案 2 :(得分:3)

我可以迟到这篇文章,但这里是我的解决方案,它也处理设置值。这使用了编辑器模板。您需要指定编辑器模板名称。我称我的'NullableBool'为

@model bool?

@{

Layout = null;

IDictionary<string, object> yesAttributes = new Dictionary<string, object>();
IDictionary<string, object> noAttributes = new Dictionary<string, object>();
IDictionary<string, object> naAttributes = new Dictionary<string, object>();

if (Model.HasValue)
{
    if (Model.Value)
    {
        yesAttributes.Add("checked", "checked");
    }
    else
    {
        noAttributes.Add("checked", "checked");
    }
}
else
{
    naAttributes.Add("checked", "checked");
}
}

@Html.RadioButtonFor(m => m, "true", yesAttributes) Yes`

@Html.RadioButtonFor(m => m, "false", noAttributes) No`

@Html.RadioButtonFor(m => m, string.Empty, naAttributes) N/A`

答案 3 :(得分:1)

这是解决问题的剃刀解决方案。这是一个非常古老的ASP问题。

问题是你需要设置this.element.context.id 属性,因为checked没有根据可空的bool检查单选按钮(这似乎是一个缺陷)。

另外,通过将单选按钮放在标签标签内,您可以通过单击标签来选择值。

共享/ EditorTemplates / Boolean.cshtml

Html.RadioButtonFor