我是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")
标签与复选框正确关联,以便点击文字将切换复选框。
答案 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)
我知道它知道它有点快,但它有效但
希望这能帮到某个地方。