Я использовал ModelAttribute для привязки объекта в веб-приложении Spring.
Как только я заметил, что в случае, если объект имеет логическое значение A, истинно, его значение не будет обновляться, если мы снимем флажок A .
Например, у меня есть объект урока, который имеет атрибут "активный" = true.
В представлении «Редактировать урок» я делаю флажок, который связывается с «активным». Все работает хорошо, если флажок установлен (объект привязки отражает изменения), но урок объекта не изменится, если мы снимем флажок.
Дальнейшие исследования говорят мне, что это потому, что значение флажка может не быть отправлено браузером (это дизайн HTML). Поэтому я должен использовать уродливый request.getParameter
, чтобы проверить, установлено ли значение.
Я просто пришел по на этот вопрос и вижу, что 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>