Java Spring with thymeleaf复选框non-checked为空,而不是false

Java Spring with thymeleaf复选框non-checked为空,而不是false,java,spring,checkbox,thymeleaf,Java,Spring,Checkbox,Thymeleaf,我的表格中有复选框: <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&

我的表格中有复选框:

  <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或false。我现在得到的是真的,如果它被选中了,没有被选中的时候什么都没有。这对我来说有点问题:

在控制器中:

@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;
}
@GetMapping(value=Utils.MAPPING\u索引)
公共模型和视图索引(@RequestParam(“titleIncl”)可选titleIncl){
…在体内调用fillSearch。。。。
}
私有搜索fillSearch(可选标题incl.){
搜索=新搜索();
//获取搜索值,如果未提供,请提供默认值。
search.setTitleIncl(titleIncl.orElse(search.isTitleIncl());
...
返回搜索;
}
此表单的全部目的是让用户选择要搜索的对象的哪些部分:

所以,如果他取消选中复选框,我在可选项中不发送FALSE,我就会遇到问题

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

那么,如果未选中复选框值,是否有一种发送可选FALSE的简单方法?

注:

  • 简单地说,我的意思是不需要为此表单搜索创建额外的端点,也不需要Javascript:)

  • 是的,表格正在申请中


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

复选框(和单选按钮)是可以切换的开/关开关 由用户提供。检查控制元件时,开关为“on” 属性已设置。提交表单时,仅选中“打开”复选框 控制可以成功

但是有了百里香,你可以试着像下面这样

<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>
  • 种子发酵剂专用底物
  • 使用的肥料
  • 使用PH校正器
不要担心那些带有name=“\u features”的隐藏输入:它们是 自动添加,以避免浏览器出现问题 提交表单时将未选中的复选框值发送到服务器

更多关于


试试这个@arseniyandru,我会给它拍一张照片这不是个好消息,我希望thymeleaf会有一些特殊的行为,我可以用其他方法来设置这个@TomasBisciak。thymeleaf与复选框无关。尝试构建一个不同的逻辑。我已经调整了逻辑,并找到了不同的解决方案。这正是比我预期的更多的代码。无论如何,这不是真的,如果你阅读了thymeleaf文档,你会看到这样的评论:
不要担心那些带有name=“\u功能”的隐藏输入:它们是自动添加的,以避免浏览器在提交表单时不向服务器发送未检查的复选框值时出现问题。
我认为您使用的th:字段是错误的(但很难从代码中分辨出来)--一般来说,您应该使用
*{…}
表达式,而不是
${…}
expressions.Hi@TomasBisciak实际上,我们可以使用thymeleaf查看更新的答案,多亏了Metroid