【问题标题】:Java Spring with thymeleaf checkbox non checked is Empty instead of false未选中百里香复选框的Java Spring是空而不是假
【发布时间】:2019-10-15 06:10:39
【问题描述】:

我的表单中有复选框:

  <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。这工作正常。我对 thsi 复选框的期望是在选中/未选中时发送真或假。我现在得到的是 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;
}

这个表单的重点是让用户选择他想要搜索的对象的哪些部分:

因此,如果他取消选中复选框并且我不发送 FALSE 可选,我会遇到问题。

当用户初始进入站点时,他不会发送任何这些参数,因此通过将所有内容设置为 true 来表现良好。 巴德一旦开始搜索并取消选择他不想搜索的部分,他仍然会以默认值结束并搜索所有内容。

如果未选中复选框值,是否有发送 Optional FALSE 的简单方法?

注意:

  • 简单来说,我的意思是没有为此表单搜索创建额外的端点,也没有 Javascript :)

  • 是的,表单在 GET 请求下

【问题讨论】:

  • 试试这个
  • @arseniyadru 我会试一试

标签: java spring checkbox thymeleaf


【解决方案1】:

无论您做什么,只有选中的复选框会发送到服务器,而不是未选中的复选框。您必须在服务器中对其进行编码以处理未选中的复选框。

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

【讨论】:

  • 这不是一个好消息,我希望 thymeleaf 会有一些特殊的行为,我可以设置它
  • 别无他法@TomasBisciak。百里香与复选框无关。尝试构建差异逻辑
  • 是的,我已经调整了逻辑并找到了不同的解决方案,它的代码比我预期的要多得多。还是谢谢
  • 这不是真的,如果您阅读 checkboxes 的 thymeleaf 文档,您会看到以下评论:Don’t worry about those hidden inputs with name="_features": they are automatically added in order to avoid problems with browsers not sending unchecked checkbox values to the server upon form submission. 我认为您使用 th:field 错误(但很难从您的代码中看出) -- 通常你应该使用*{...} 表达式,而不是${...} 表达式。
  • 嗨@TomasBisciak 实际上我们可以用百里香做看到感谢银河战士的更新答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-14
  • 2020-03-02
  • 2020-10-31
  • 2015-04-13
  • 2016-10-11
  • 2021-10-28
  • 1970-01-01
相关资源
最近更新 更多