问题:复选框值未正确绑定到我的表单。结果是我的所有布尔值都为空(至少是没有绑定的布尔值),并且现有的布尔值没有使用用户更改的值进行更新。
详细信息:我知道如果未选中复选框,则不会将复选框提交给服务器。但是,我确实在连接Eclipse调试器时看到了请求中的值。使用jQuery / Datatable填充数据,但使用表单提交将数据发回服务器。
Spring MVC版本:3.2.8 我假设它的配置,但我没有看到我错在哪里。这是我在控制器中所做的一小段代码片段。
@Controller
public class CheckboxController {
...
@RequestMapping(value = "saveCheckboxes*", method = RequestMethod.POST)
public String saveCheckboxes(@ModelAttribute(SESSION_FORM_KEY) CheckboxForm form, BindingResult result, ModelMap model) {
// VALIDATE HERE...
if ( !result.hasErrors() ) {
// SAVE
}
else {
// DON'T SAVE (alert user)
}
}
}
所以Spring MVC用于将请求输入绑定到我的表单。表单定义如下,其中包含一个带有布尔属性的摘要对象列表。
public class CheckboxForm {
private List<Summary> summaries;
...
}
public class Summary {
private boolean selected;
...
}
我使用jQuery / Datatables来填充我的在线数据网格。输入是使用数据表中的回调动态创建的。
var tableWidget = (function($) {
init = function() {
...
"aoColumnDefs": [
{ "aTargets": [0], "sName": "", "mData": "selected" "stype": "html", "sClass": "center", "mRender": renderCheckbox, "bSortable":false, "sWidth": "50px" }
...
};
renderCheckbox = function(source, type, row) {
var $name = 'checkboxForm.summaries['+row.index+'].selected';
return createCheckbox($name, source);
};
createCheckbox = function(name, checked) {
var $checked = (checked === true) ? ' checked="checked"' : '';
return '<input type="checkbox" name="'+name+'" value="true"'+$checked+'/><input type="hidden" name="_'+name+'" value="on"/>';
}
...
))(jQuery);
在完成所有这些之后,我连接了调试器并将其跟踪到WebDataBinder中。我发现它似乎在方法中抛出和异常:
public boolean isWritableProperty(String propertyName)
说无法评估该属性。返回的每个属性都会发生这种情但是,我可以确认请求中的内容是我期望的输入。
答案 0 :(得分:0)
首先,除非您知道为什么要在@RequestMapping
方法中避免使用相对URL。这是错误的常见原因。
接下来,当您直接生成复选框而没有添加spring:checkbox
的所有铃声和口哨声时,您将无法获得自动错误消息,并且如果取消选中最后一个复选框值,则可能会遇到问题,因为它们是未选中的将不会被浏览器传输,Spring将永远不会看到它们提供更短的列表(如果未选中,则甚至是空列表)。
话虽如此,您的问题是您使用checkboxForm.summaries[index].selected
,而Spring只期望summaries[index].selected
。移除checkboxForm
,您的控制器应影响@ModelAttribute CheckboxForm form
的值。