将Nullable Bool渲染为CheckBox

时间:2011-12-13 03:54:52

标签: asp.net-mvc asp.net-mvc-3

我是WebForms到MVC的新手。我有一个类型为bool?的视图模型字段,默认情况下,EditorFor()将此字段呈现为具有“未设置”选项的DropDownList。我更喜欢将其渲染为CheckBox,如果值为null,则将其设置为未选中。

字段名称为RFP.DatesFlexible,因此我在视图中编写了以下标记:

<input type="checkbox" id="RFP_DatesFlexible" name="RFP.DatesFlexible" />
<label for="RFP_DatesFlexible">My Dates are Flexible</label>

但这不起作用。结果始终为null,ModelState.IsValid为false。

有人能说我怎样才能做到这一点吗?

修改

这是我最终得到的代码,看起来效果很好。

@Html.CheckBox("RFP.DatesFlexible", Model.RFP.DatesFlexible ?? false)
@Html.Label("RFP.DatesFlexible", "My Dates are Flexible")

标签与复选框正确关联,以便点击文字将切换复选框。

3 个答案:

答案 0 :(得分:5)

这样的东西?

型号:

public class MyViewModel
{
    public ViewModel2 RDP { get; set; }
}

public class ViewModel2
{
    public bool? DatesFlexible { get; set; }
}

控制器:

    public ActionResult TestBool()
    {
        return View(new MyViewModel { RDP = new ViewModel2() });
    }

    [HttpPost]
    public ActionResult TestBool(MyViewModel vm)
    {
        return View();
    }

查看:

@model mvc_testing_2.Models.MyViewModel

@using (Html.BeginForm())
{
    @Html.CheckBox("RDP.DatesFlexible", 
        Model.RDP.DatesFlexible != null && (bool)Model.RDP.DatesFlexible)

    <input type="submit" value="go" />
}

答案 1 :(得分:1)

首先,我认为这有助于了解Html.CheckBox的工作原理。这不是你所期望的。看看HTML.CheckBox Behaviour

要回答您的问题,您的代码无效的原因是因为<input />要求value='true'正确绑定。例如:

<input type='checkbox' name='RFP.DatesFlexible' value='true' />

如果要检查,请添加checked='checked'属性。

这就是为什么我通常用自己的方法覆盖Html.CheckBox方法。默认实现只是令人困惑。

答案 2 :(得分:0)

我知道它被标记为已接受但是我遇到了类似的问题,但我正在迭代子项,所以我遇到了名称参数bool的问题? isOpen

当我使用它时,它确实绑定到post上的ViewModel但是呈现了下拉列表:

@Html.EditorFor(model => model.Days[i].isOpen) 

这会渲染复选框,但在帖子中的值为null:

@Html.EditorFor("isOpen", model.Days[i].isOpen ?? false) 

通过查看渲染的html,我在解决它的视图中执行了此操作:

@Html.CheckBox("Days[" + i +"].isOpen", Model.Days[i].isOpen ?? false)

我知道它知道它有点快,但它有效但

希望这能帮到某个地方。