Java Spring с не установленным флажком thymeleaf - Пустой вместо ложного - PullRequest
0 голосов
/ 29 мая 2019

У меня есть флажок внутри моей формы:

  <div class="form-check form-check-inline">
                        <input type="checkbox" th:field="${search.titleIncl}" />
                        <label class="form-check-label" th:for="${#ids.next('covered')}">Title</label>
                    </div>

Этот флажок по умолчанию должен быть включен, поскольку для объекта поиска это значение имеет значение true.Это отлично работает.То, что я ожидал от этого флажка, это отправить либо true, либо false, когда его отметили / сняли флажок.То, что я получил сейчас, это True, если его проверил, и ничего, когда не проверил.Это его небольшая проблема для меня:

В контроллере:

@GetMapping(value = Utils.MAPPING_INDEX)
public ModelAndView index(@RequestParam("titleIncl") Optional<Boolean> titleIncl) {
    ...calling fillSearch inside of body....
}


private Search fillSearch(Optional<Boolean> titleIncl..) {

        Search search = new Search();

        //Get seach value if nothing provided give me default.
        search.setTitleIncl(titleIncl.orElse(search.isTitleIncl()));
        ...

        return search;
}

Весь смысл этой формы - заставить пользователя выбрать, какие части объекта он хочет найти: enter image description here

Так что, если он снимает флажок и я не отправляю FALSE необязательно, я сталкиваюсь с проблемой.

Когда пользователь изначально заходит на сайт, он не отправляет ни одного изэти параметры, поэтому он ведет себя нормально, устанавливая все в true.Когда он начинает поиск и отменяет выбор частей, в которых он не хочет искать, он все равно получает значения по умолчанию и выполняет поиск по всему.

Так есть ли простой способ отправки Optional FALSE, если значение флажка не выбрано?

Примечание:

  • Под простым я подразумеваю создание дополнительной конечной точки для поиска этой формы и отсутствие Javascript:)

  • И да, форма находится под запросом GET

1 Ответ

1 голос
/ 29 мая 2019

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

https://www.w3.org/TR/html401/interact/forms.html#form-controls

Флажки (и переключатели) являются переключателями включения / выключения, которые могут переключаться пользователем.Переключатель включен, когда установлен атрибут проверяемого элемента управления.Когда форма отправлена, только элементы управления «вкл» могут стать успешными.

Но с тимьяном вы можете попробовать, как показано ниже,

<ul>
  <li th:each="feat : ${allFeatures}">
    <input type="checkbox" th:field="*{features}" th:value="${feat}" />
    <label th:for="${#ids.prev('features')}" 
           th:text="#{${'seedstarter.feature.' + feat}}">Heating</label>
  </li>
</ul>

, который будет производить ниже HTML,

<ul>
  <li>
    <input id="features1" name="features" type="checkbox" value="SEEDSTARTER_SPECIFIC_SUBSTRATE" />
    <input name="_features" type="hidden" value="on" />
    <label for="features1">Seed starter-specific substrate</label>
  </li>
  <li>
    <input id="features2" name="features" type="checkbox" value="FERTILIZER" />
    <input name="_features" type="hidden" value="on" />
    <label for="features2">Fertilizer used</label>
  </li>
  <li>
    <input id="features3" name="features" type="checkbox" value="PH_CORRECTOR" />
    <input name="_features" type="hidden" value="on" />
    <label for="features3">PH Corrector used</label>
  </li>
</ul>

Не беспокойтесь о тех скрытых входах с name = "_ features": они добавляются автоматически, чтобы избежать проблем с браузерами, не отправляющими непроверенные значения флажков на сервер при отправке формы.

Подробнее,

https://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html#checkbox-fields

...