2012-01-04 82 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