2017-03-05 45 views
0

在我的MVC查看我有几个复选框:检查复选框被选中MVC控制器

<form method="POST" id="formRegistration" action="Registration/SubmitRegistration" > 
//Other code... 
    <input name="test1" type="checkbox" /> 
    <input name="test2" type="checkbox" /> 
</form> 

在控制器我GET-使用POST要求─数据,我把它插入到数据库:

public void AddRegistered(Registration r) 
{ 
//Other code... 
    dParameters.Add("test1", r.test1.ToString()); 
    dParameters.Add("test2", r.test2.ToString()); 
//Other code... 
} 

问题是,即使复选框被选中,我仍然收到false的值。

Wham am我错过?

+0

使用'Html.CheckBoxFor'而不是使用手动HTML。 – Dai

+0

这是使用手动HTML的要求,我不能使用Razor。 – user3378165

+0

复选框发回它的控件的值被检查(如果没有检查,则没有任何设置。你的设置值=“false”',所以它可以提交的都是'false'。如果你不使用'HtmlHelper'方法,那么不要打扰使用mvc,因为你永远不会得到正确的模型绑定。 –

回答

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来做到这一点,所以你不需要专门注释一个属性,使其工作。


就个人而言,我更喜欢“修复它在客户端上”的方法,因为你会得到两种truefalse回发到每一个是你所期望的最接近的方式时间服务器HtmlHelper这样做。

+0

_nothing将被发送,如果复选框未取消check_简直是错的! - '@ Html.CheckBoxFor()'正确地生成2个输入,一个复选框,其值为'True'并且一个隐藏的输入'value ='False'' –

+0

也许你说的对,我无法检查现在 - 但是我不得不抛弃'HtmlHelper',并且之前手动执行此操作,因为我没有将虚假值发回到服务器。可能是单独的问题,不确定。 – caesay

+0

感谢您的明确解释! – user3378165

0

你缺少value属性:

<input name="test1" type="checkbox" value="true" /> 
<input name="test2" type="checkbox" value="true" /> 

就这么简单。

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应该在你的模型类。

+0

您可以也可以做'' - 尽管这对嵌套/子视图或复杂视图模型不起作用。 – Dai