我用的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>
謝謝,你怎麼知道這種方式?我的意思是,我搜索了很多,但沒有找到任何結果。只需稍加修改:我需要使用「_active」而不是「_lesson.active」來使其工作。 – 2012-01-04 08:48:40
我已更正名稱。 - 我怎麼知道的?我以專業的方式做了Spring MVC超過5年。當我開始這個問題時非常受歡迎。順便說一句:如果您使用Spring複選框jsp標記,則隱藏的字段已包含在內。 – Ralph 2012-01-04 09:33:20
有用的信息。但是,我發現如果元素名稱包含'.',則該值不會自動更改。我想我必須改變它使用JavaScript – abiieez 2013-06-18 14:47:25