сохранить значения модели в случае ошибки и показать тот же шаблон тимьяна - PullRequest
0 голосов
/ 15 марта 2020

Насколько я понимаю, атрибуты модели связаны с каждым запросом, и они не могут выдержать несколько запросов, пока мы не добавим их как flashAttributes.

У меня есть простой метод контроллера, который показывает пользователю несколько вариантов выбрать из. Тем не менее, эти параметры присоединяются к шаблону тимелина с помощью атрибутов модели.

<div class="input-group mb-3" th:each="ingredient : ${recipes.ingredients}">
<div class="input-group-prepend">
    <div class="input-group-text">
        <input aria-label="Checkbox for following text input" name="ingredient"
                th:value="${ingredient.name}" type="checkbox">
    </div>
    <input aria-label="Text input with checkbox" class="form-control" disabled
            th:value="${ingredient.name + '     ' + ingredient.price + 'Rs.'}"
            type="text">
</div>

примите здесь "рецепты" в качестве атрибута модели, который был введен в modelMap внутри контроллера.

при сбое проверки бина, ниже строки выделяется.

if (errors.hasErrors()) return "selectItem";

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

Я решил эту проблему, используя метод @ModelAttribute внутри того же контроллера, чтобы установить атрибуты модели для каждого HTTP-запроса для указанного контроллера c (пока он не включен в controllerAdvice для глобального эффекта).

Я в замешательстве, если я на правильном пути || есть ли какой-нибудь элегантный способ добиться этого.

Установка атрибута Model для каждого запроса является своего рода накладными расходами, когда я хочу, чтобы они были доступны для нескольких сопоставлений запросов.

1 Ответ

0 голосов
/ 15 марта 2020

Когда вы говорите:

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

Вы имеете в виду, что когда страница перезагружается из-за ошибок валидации, ваши атрибуты модели больше не существуют и Thymeleaf, вероятно, возвращает ошибку, потому что не может их найти, исправить?

Если это так, то вам придется вручную подготовить те же атрибуты модели в операторе if (то есть добавляя их в MapModel):

if (errors.hasErrors()) {
 map.addAttribute("recipes", recipes);
 return "selectItem";
}

В качестве альтернативы, если вам нужен этот атрибут модели также на других страницах вашего контроллера, вы можете уменьшить дублирование кода, объявив метод с помощью ModelAttribute аннотация, которая добавит этот атрибут ко всем моделям вашего контроллера:

@ModelAttribute("recipes")
public Recipes loadRecipes() {
    // get list of Recipes
    return list;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...