2012-01-04 86 views
13

我用的ModelAttribute绑定对象在Spring Web应用程序。错误时,复选框值不会绑定到对象中?

一旦我注意到,如果对象具有布尔值A为真,如果我们取消选中A的复选框,则其值不会更新。

例如,我有具有属性“活动” =真一个课程对象。 在“编辑课程”视图中,我制作了一个复选框,该复选框绑定为“活动”。如果选中该复选框(绑定对象反映更改),事情就会正常运行,但如果我们取消选中复选框,则对象课程不会更改。

进一步的研究告诉我,那是因为复选框值可能不会通过浏览器提交的(这是一个在设计的HTML)。所以我必须使用丑陋的request.getParameter来检查是否设置了该值。

我刚来this question,我发现asp.net mvc提供了一种更优雅的解决方法。我认为Spring必须提供类似的东西。有谁知道这是怎么做到的吗?

以下是我的代码:

控制器代码:

@RequestMapping(value="/test", method = RequestMethod.POST) 
    public String processEditLesson(@Valid Lesson lesson, BindingResult bindingResult, Model model) { 
     System.out.println("Lesson is active: " + lesson.isActive()); // still "true" even if the checkbox is unset 

     // Current work-around 
     String isActive = request.getParameter("active"); 
     if (StringUtils.isNotNullOrEmpty(isActive)) { 
      lesson.setActive(true); 
     } else { 
      lesson.setActive(false); 
     } 
     ... 
    } 

查看代码:

<form id="lesson" class="EditorForm" action="${rc.getContextUrl('/test.html')}" method="post" > 

    <fieldset> 
     <legend><@spring.message code="lesson.edit"/></legend> 
     <@spring.formHiddenInput "lesson.id" /> 
     <@spring.formHiddenInput "lesson.studio.id" /> 

     <div class="Entry"> 
      <label for="name"><@spring.message code="lesson.message"/></label> 
      <@spring.formInput "lesson.message" /> 
      <span class="ErrorMessage"><@spring.showErrors "<br/>" /></span> 
     </div> 

     <input type="checkbox" name="active" checked="checked" /> 
     <label for="active">${rc.getMessage('lesson.active')}</label> 

     <input type="submit" value="<@spring.message code='common.update' />" /> 
    </fieldset> 
</form> 

回答

20

春天有一个内置的解决方法。

只需将此额外的隐藏字段添加到窗体:

<input type="hidden" value="on" name="_active"/>

与领先的下划线的参数是某种标记,以表明具有相同名称的复选框参数的存在,但不下划线。

如果仅提交_active=on,则Spring现在应将lesson.active设置为false。

+0

谢谢,你怎么知道这种方式?我的意思是,我搜索了很多,但没有找到任何结果。只需稍加修改:我需要使用“_active”而不是“_lesson.active”来使其工作。 – 2012-01-04 08:48:40

+1

我已更正名称。 - 我怎么知道的?我以专业的方式做了Spring MVC超过5年。当我开始这个问题时非常受欢迎。顺便说一句:如果您使用Spring复选框jsp标记,则隐藏的字段已包含在内。 – Ralph 2012-01-04 09:33:20

+1

有用的信息。但是,我发现如果元素名称包含'.',则该值不会自动更改。我想我必须改变它使用JavaScript – abiieez 2013-06-18 14:47:25

2

我认为你应该使用springframework的标签 - 你为什么要使用普通的HTML?如果你的观点是JSP页面只需要导入:

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 

,然后你可以使用:

<form:checkbox path="path" label="label" /> 

它处理的问题。

+0

感谢您的jsp方法,但实际上我使用了freemarker。 Freemarker的宏formCheckBoxes没有任何例子可以用它 – 2012-01-04 09:35:59

1

你可以使用Spring框架的标签,如它会自动将您选择的价值bean类,然后它会很容易在你的控制器类来获得它的值。

的路径,你需要把你的bean的变量名

,并利用这一点,你需要给命令名称到您的表单和使用该命令的名字你的bean对象绑定到该JSP

模型。 addAttribute(“命令名称”,bean对象)在你的控制器中使用这个绑定对象。

+0

对不起,但我不使用jsp。我使用freemarker,如果你知道如何在freemarker中编写它,请告诉我。现在,我用我的自定义宏代替。 – 2012-01-05 03:03:56

+0

抱歉不知道该伙伴! – Raj 2012-01-18 10:51:18