RadioButtonFor不绑定null值

时间:2012-09-04 12:54:47

标签: asp.net-mvc-3

我有这段代码

@Html.RadioButtonFor(model => model.LivStato, 1, Model.LivStato == 1)
@Html.RadioButtonFor(model => model.LivStato, -1, Convert.ToString(Model.LivStato) == string.Empty)

如果Model.LivStato == 1为真,则选中单选按钮。

我不明白为什么如果Convert.ToString(Model.LivStato) == string.Empty为真,则不检查单选按钮

我也试试这个

@Html.RadioButtonFor(model => model.LivStato, -1, !Model.LivStato.HasValue)

但不起作用。

在模型中:

public short? LivStato { get; set; }

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:7)

更新回答

哎呀,如果 null 单选按钮不是列表中的第一个,我的原始答案不起作用。正如@ sohtimsso1970所指出的那样,单选按钮会有一个checked属性,通常会导致它被选中,即使该值不是null ,除非在DOM 中有另一个已检查的单选按钮,当然,如果真/假绑定单选按钮低于空值,则会出现。

考虑到这一点,这是一个更好的解决方案:

@{
    var dict = new Dictionary<string, object>();
    if (!Model.LivStato.HasValue) { dict.Add("checked", "checked"); }
}
<label>@Html.RadioButtonFor(model => model.LivStato, "", dict) Null</label>
<label>@Html.RadioButtonFor(model => model.LivStato, 1) +1</label>
<label>@Html.RadioButtonFor(model => model.LivStato, -1) -1</label>

无论DOM上的空值绑定单选按钮位于何处,它都可以正常工作,并且还可以呈现正确的HTML。


原始回答:

使用以下单选按钮将绑定到 null

<%: Html.RadioButtonFor(model => model.LivStato, "", new { @checked = !Model.LiveStato.HasValue }) %>

需要checked属性,以便在ViewModel属性为null时正确检查单选按钮。

答案 1 :(得分:3)

查看HtmlHelper.RadioButtonFor重载:没有人使用布尔第三参数作为“检查按钮,如果值==某事”。第三个参数(当它存在时)仅适用于htmlAttributes。

http://msdn.microsoft.com/en-us/library/ee830415%28v=vs.108%29

如果你的firstLine有效,那只是因为你使用1作为第二个参数(Model.LivStato == 1没有做任何事情)。

您可以尝试(未经测试)

@Html.RadioButtonFor(model => model.LivStato, 1)
@Html.RadioButtonFor(model => model.LivStato, -1)

并在控制器中将-1更改为null。