Подтвердить что ты не робот

Значения флажка не привязываются к объекту, когда false?

Я использовал ModelAttribute для привязки объекта в веб-приложении Spring.

Как только я заметил, что , если объект имеет логическое значение A, это значение true, его значение не будет обновлено, если снять флажок A с помощью флажка.

Например, у меня есть объект Lesson, у которого есть атрибут "active" = 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>
4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

который обрабатывает проблему.

Ответ 3

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

по пути вам нужно поместить имя переменной bean

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

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