Значения флажков не привязываются к объекту, когда ложь? - PullRequest
14 голосов
/ 04 января 2012

Я использовал 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>

Ответы [ 3 ]

20 голосов
/ 04 января 2012

Spring имеет встроенный обходной путь.

Просто добавьте это дополнительное скрытое поле в форму:

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

Параметр с начальным подчеркиванием является своего рода маркером, указывающим на наличие параметра флажка с тем же именем, но без подчеркивания.

Spring теперь должен установить lesson.active в false, если отправлено только _active=on.

2 голосов
/ 04 января 2012

Я думаю, что вы должны использовать теги springframework - почему вы используете простой HTML? Если вы просматриваете страницу JSP, просто импортируйте:

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

и тогда вы можете использовать:

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

которая решает проблему.

1 голос
/ 04 января 2012

Вы можете использовать теги Spring Framework, так как он автоматически установит выбранное вами значение в класс bean, и тогда будет очень легко получить его значение в вашем классе контроллера.

на пути вам нужно указать имя переменной вашего компонента

и чтобы использовать это, вам нужно дать имя команды вашей форме и использовать это имя команды для привязки вашего объекта bean к этому jsp

model.addAttribute («имя команды», объект бина) использует это в вашем контроллере для привязки объекта.

...