在我的MVC视图中,我有几个复选框:
<form method="POST" id="formRegistration" action="Registration/SubmitRegistration" >
//Other code...
<input name="test1" type="checkbox" />
<input name="test2" type="checkbox" />
</form>
在控制器上我使用POST请求 - 数据并将其插入数据库:
public void AddRegistered(Registration r)
{
//Other code...
dParameters.Add("test1", r.test1.ToString());
dParameters.Add("test2", r.test2.ToString());
//Other code...
}
问题是,即使选中了复选框,我仍然会获得false
值。
我想失踪吗?
答案 0 :(得分:1)
所以你要做的第一件事就是看看使用chrome调试工具或类似工具发送到服务器的实际数据。您可能会发现,如果选中,您的复选框值将设置为on
,否则如果未选中则会完全丢失。
评论中的一个建议是@Html.CheckBoxFor
,但是如果取消选中该复选框并且在特定情况下仍然可能成为问题,则会遇到任何问题。
您有两种解决方案 - 在客户端上修复它,或者在服务器上修复它。
将其修复到客户端:
为此,您需要(使用javascript)为每个复选框添加隐藏字段。原谅我,我不是由编辑来测试它,但它可能看起来像这样(来自内存):
$('input[type="checkbox"]').each(function(el) {
var hidden = $('<input type="hidden" />');
hidden.name = el.name;
el.after(hidden);
el.on("change", function(el) {
hidden.value = el.checked ? "true" : "false";
});
});
将其修复在服务器上:
为此,您需要创建一个自定义PropertyBinder
,将on
识别为布尔值true
。这将在属性属性级别设置。您也可以覆盖全局ModelBinder
来执行此操作,这样您就不需要专门注释属性以使其工作。
就个人而言,我更喜欢“在客户端修复它”的方法,因为每次都会将true
或false
发送回服务器,这是您所期望的,并且是最接近HtmlHelper
的方式。
答案 1 :(得分:0)
您缺少value
属性:
<input name="test1" type="checkbox" value="true" />
<input name="test2" type="checkbox" value="true" />
就这么简单。
答案 2 :(得分:0)
如果您不想使用HtmlHelper类,可以这样做
<form method="POST" id="formRegistration" action="Registration/SubmitRegistration" >
<input name="test1" type="checkbox" value="@Model.test1" />
<input name="test2" type="checkbox" value="@Model.test2" />
test1和test2应该在你的模型类中。