@Nulltiton

Почему @ModelAttribute возвращает значение только одной колонки?

На странице настроек через модель выводятся все настройки, который можно отредактировать прямо на этой форме. По нажатию на кнопку "Сохранить" выполняется POST-запрос. Однако из ModelAttribute возвращается только третий столбец (value), в остальных колонках передаются - null.

Контроллер:
@PostMapping("/save")
    public String saveSettings(@ModelAttribute("settings") SettingsDTO settingsDTO, Model model) {
        List<Setting> settings = settingsDTO.getSettings();

        //вывод, какие данные получилось забрать
        System.out.println("\n\n\n");
        for (Setting setting : settings)
            System.out.println(setting.getId() + " " + setting.getName() + " " + setting.getValue());
        System.out.println("\n\n\n");

        model.addAttribute("settings", settingsService.saveSettings(settingsDTO));
        return "settings/index";
    }


Thymeleaf страница:
<form method="post" th:action="@{'/settings/save/'}" th:object="${settings}" modelAttribute="settings">
<table class="table table-bordered">
    <thead>
        <tr>
            <th>#</th>
            <th>Название настройки</th>
            <th>Значение</th>
            <th>Действия</th>
        </tr>
    </thead>
    <tbody>
        <tr class="Authors-item" th:each="setting, item : *{settings}" >
            <td th:text="*{settings[__${item.index}__].id}">Id</td>
            <td><input disabled th:field="*{settings[__${item.index}__].name}"></td>
            <td><input th:field="*{settings[__${item.index}__].value}"></td>
            <td><a th:href="@{/settings/delete/{id}(id=${setting.id})}" href="#">Удалить</a></td>
        </tr>
    </tbody>
</table>
<input type="submit" class="btn btn-block btn-primary btn-lg font-weight-medium auth-form-btn" value="СОХРАНИТЬ">
</form>


Подскажите, почему ModelAttribute не возвращает все значения с формы?
  • Вопрос задан
  • 107 просмотров
Решения вопроса 1
Erik_Mironov
@Erik_Mironov
Старые вопросы: *Dies from cringe*
Когда вы используете атрибут disabled для<input>, значение этого поля не отправляется на сервер вместе с другими данными формы. Таким образом, при отправке формы, поля с атрибутом disabled будут игнорироваться.

В вашем коде, поле *{settings[__${item.index}__].name} установлено как disabled, и поэтому name всегда будет null при обработке POST-запроса на сервере.

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

<td>
    <input disabled th:value="*{settings[__${item.index}__].name}">
    <input type="hidden" th:field="*{settings[__${item.index}__].name}">
</td>
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы