【发布时间】:2017-06-01 17:49:47
【问题描述】:
我在表单中有以下复选框:
<input type="checkbox" name="preparationNeeded" >
这是通过 javascript 发送到 SpringController:
.ajax({
type : 'POST',
url : '${home}ui' + action + name + '.html',
data : $('#updateform').serialize(),
success : function(data) {
console.log("SUCCESS: ", data);
document.getElementById('viewmodal').style.display = 'none';
display(data);
},
error : function(e) {
console.log("ERROR: ", e);
displayError(e.responseText);
}
});
序列化如下:
选中时:
FORM: id=1& ... preparationNeeded=true ...
未选中时(不包括复选框值):
FORM: id=1& ...
这被解析为具有布尔字段 Article.preparationNeded 的对象。这在几乎所有情况下都可以正常工作,但问题是 preparationNeeded 的默认值为 true。
因此,如果选中该复选框,则正确发送值 true。但是如果未选中该复选框,则该值不会被序列化并采用该字段的默认值,而不是 false。
一些建议:
How to change the value of a check box onClick using JQuery?
你也可以考虑引入隐藏输入
如果我在 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 html spring