Javascript 使html复选框在序列化中发送true/false

Javascript 使html复选框在序列化中发送true/false,javascript,html,spring,Javascript,Html,Spring,我在表格中有以下复选框: <input type="checkbox" name="preparationNeeded" > 序列化如下所示: FORM: id=1& ... preparationNeeded=false&preparationNeeded=true ... 选中时: FORM: id=1& ... preparationNeeded=true ... FORM: id=1& ... 未选中时(不包括复选框值): FO

我在表格中有以下复选框:

<input type="checkbox" name="preparationNeeded" >
序列化如下所示:

FORM:  id=1& ... preparationNeeded=false&preparationNeeded=true ...
选中时:

FORM:  id=1& ... preparationNeeded=true ...
FORM:  id=1& ... 
未选中时(不包括复选框值):

FORM:  id=1& ... preparationNeeded=true ...
FORM:  id=1& ... 
这被解析为一个带有布尔字段的对象Article.preparationNeded。这在几乎所有情况下都可以正常工作,但问题是preparationNeded的默认值为true。

因此,如果选中复选框,则正确发送值true。但如果未选中该复选框,则该值不会序列化,而是采用字段的默认值,而不是false

一些建议:

也可以考虑引入隐藏的输入< /P> 如果我在value=“false”中包含一个隐藏值,则当未选中该复选框时,该选项可以正常工作。但如果选中此选项,则序列化如下所示:

FORM:  id=1& ... preparationNeeded=false&preparationNeeded=true ...
这将引发org.springframework.validation.FieldError

Field error in object 'item' on field 'preparationNeeded': rejected value [false,true]; codes [typeMismatch.item.preparationNeeded,typeMismatch.preparationNeeded,typeMismatch.boolean,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [item.preparationNeeded,preparationNeeded]; arguments []; default message [preparationNeeded]]; default message [Failed to convert property value of type [java.lang.String[]] to required type [boolean] for property 'preparationNeeded'; nested exception is java.lang.IllegalArgumentException: Invalid boolean value [false,true]]
因为该值为“假,真”


有什么建议吗?谢谢

您可以将复选框的默认值设置为false,以便在将表单解析为对象时,只有选中复选框时才会为true


如果希望在默认情况下选中该复选框,以便用户不必单击它,则可以在页面加载时通过JavaScript手动选中该复选框。

您可以将复选框更改为虚拟名称,并将PreparationRequired设置为隐藏字段,并使用JS在每次更改复选框状态时适当设置PreparationRequired的值。

一个选项是观察复选框上的单击,当选中复选框时,清除隐藏输入上的名称。这样,只有在未选中复选框时,隐藏的输入值才会添加到序列化的输出中

请参见下面的演示:

$(文档).ready(函数(){
$(“#序列化”)。单击(序列化窗体);
$(“#preparationneedcheckbox”)。单击(handleCheckboxClick);
});
函数序列化形式(){
log('serialized form:',$('#updateform').serialize());
}
函数handleCheckboxClick(){
$('hiddenCheckboxInput').attr('name',this.checked?'':this.name);
}

需要准备:

序列化
嘿嘿,是的。非常感谢。如果您也想这样做,可以在虚拟复选框上指定一个属性,这样您就可以使用$(“#updateForm:input[name!=“PreparationNeedDummy”]”)。serialize()将其保留在您提交的序列化表单数据之外。