在Foreach循环中默认选中设置RadioButtonFor()

时间:2014-04-30 07:56:50

标签: c# asp.net-mvc-4 razor radio-button

我使用@Html.RadioButtonFor扩展方法有一种奇怪的行为。我正在使用foreach循环来创建RadioButton和By三元运算符列表。我试图设置一个尊重条件的人来检查,但它总是最后一个被检查。我搜索了类似的问题,但我不确定是否找到了什么。我不想创建/使用自定义RadioButtonList

我的查看

中的代码
@foreach (var item in Model.Entities)
        {
        <div>
                 @Html.RadioButtonFor(m => item.Default, item.EntityId,
                       new { @checked = item.Default ? "checked" : "" })//item.Default is a bool and there is only one set to True 
        </div>
        }

但是在我的浏览器中,即使checkeditem.Default,也始终是最后创建的false。 还有什么东西

2 个答案:

答案 0 :(得分:7)

如果存在checked属性(无论它的实际值是多少),浏览器会将按钮视为已选中。这是HTML5行为。我猜所有的radiobuttons都定义了checked属性,浏览器会选择最后一个按钮作为最终选择的按钮。

我的解决方案是创建一个自定义的RadioButtonFor扩展方法,该方法接受checked-state的布尔值,并根据值将checked属性添加到htmlAttributes字典中。像这样:

    public static MvcHtmlString RadioButtonFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression, object value, object htmlAttributes, bool checkedState)
    {
        var htmlAttributeDictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);

        if (checkedState)
        {
            htmlAttributeDictionary.Add("checked", "checked");
        }

        return htmlHelper.RadioButtonFor(expression, value, htmlAttributeDictionary);
    }

然后您可以在视图中使用该方法(不要忘记添加创建扩展方法的命名空间并将其放在配置中),如下所示:

    @foreach (var item in Model.Entities)
    {
    <div>
             @Html.RadioButtonFor(m => item.Default, item.EntityId, new { /* other attributes go here */ }, item.Default)
    </div>
    }

答案 1 :(得分:-1)

运营商的优先权导致了这里的问题;由于在比较之前存在相等性,因此该短语将被评估为

(@checked = item.Default) ? "checked" : ""

而你希望它是

@checked = (item.Default ? "checked" : "")
相关问题