LINUX.ORG.RU

Не отправляются данные на сервер при POST запросе

 , , , ,


0

1

Господа Java-исты, вопрос к вам.

Юзаю Spring, Thymeleaf (SpringBoot2, Thymeleaf 5 - он же в СпрингБуте 2?)

Есть форма редактирования пользователя:

<form th:action="@{'/admin/users/'+${userForm.id}}" method="post" th:object="${userForm}">
            <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
            <input type="hidden" name="lang" th:value="${#locale.language}"/>
            <input type="hidden" name="id" th:value="${userForm.id}"/>

            <!--roles-->
            <div class="form-group">
                <label for="roles" th:text="#{admin.user.roles}"></label>
                <div id="roles">
                    <div th:each="role : ${roles}">
                        <input type="checkbox" th:field="*{roles[__${role.name}__]}" th:checked="${userForm.roles.get(role)}" th:disabled="${disabledRoles.contains(role)}"/>
                        <span style="padding-left: 10px;" th:text="${@translationService.translate(role)}">Role</span>
                    </div>
                </div>
            </div>

            <div class="form-group">
                <button class="btn btn-success" type="submit" th:text="#{admin.action.update.btn}"></button>
            </div>

        </form>

userForm передается такой объект, предварительно заполненный:

@Getter @Setter
public class UserForm extends BaseForm {

    private String username;
    private String realname;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birthday;
    private String phoneNumber;
    private Long telegramChatId = 0L;
    private Boolean deletedMark = false;

    private Map<UserRole.ROLE, Boolean> roles = new HashMap<>();

    private Long city;

}

В итоге имею вот такое: https://i.imgur.com/u67fnlO.png

Bсе бы хорошо, но!

Если переключить галки (снять, поставить), то все хорошо, на сервере в контроллер принимаются только взведенные галки:

    @PostMapping("/{userId:\\d+}")
    public String doUserEdit(@PathVariable(name = "userId") Long userId, UserForm userForm, Model model, Principal principal) {
    //...
    }

Но вот если жмякнуть Submit ничего не трогая, то отрендеренные как «checked» галки на сервер не отправляются.

Почему?

★★★★★

Ответ на: комментарий от vtVitus

да, видимо, это так и есть.

но! почему не работает readonly свойство? поменял на

<input type="checkbox" th:field="*{roles[__${role.name}__]}" th:checked="${userForm.roles.get(role)}" th:readonly="${disabledRoles.contains(role)}"/>

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

рендерится так:

<input type="checkbox" readonly="readonly" checked="checked" id="rolesUSER1" name="roles[USER]" value="true">

UPD: нашел ответ тут https://stackoverflow.com/a/12267294/2798461

bvn13 ★★★★★ ()
Последнее исправление: bvn13 (всего исправлений: 3)