带有Thymeleaf的列表中的动态复选框

时间:2017-08-30 08:59:04

标签: checkbox thymeleaf

我尝试从动态创建的复选框中保存值:

<div>
    <ul>
       <li th:each="item, stat : *{users}">
         <input type="checkbox" th:field="*{users[__${stat.index}__]}" th:value="${item}" />
         <label th:text="${item}"></label>
      </li>
   </ul>
</div>

控制器提供String项目如下:

public List<String> getUsers() {
    return users;
}

字符串的设定者是:

public void setUsers(final String[] users) {
    for (final String string : users) {
        System.out.println(string);
    }
}

html页面中显示的值正确无误。但是当我单击“保存”按钮并调用setter时,值为空。我能做什么,问题出在哪里? 任何帮助都会很感激。

2 个答案:

答案 0 :(得分:0)

请查看Tutorial: Thymeleaf + Spring中有关handlin多值复选框的部分。

您应该提供一些模型属性(类型为List<String>),其中包含可供选择的所有用户。我们称之为selectableUsers

然后它可以通过以下方式与您的表单支持bean(包含users的bean)协作:

<div>
    <ul>
       <li th:each="item : ${selectableUsers}">
         <input type="checkbox" th:field="*{users}" th:value="${item}" />
         <label th:for="${#ids.prev('users')}" th:text="${item}"></label>
      </li>
   </ul>
</div>

注意我认为字段的getter和setter应该处理相同的类型,但它们不会(getter返回List<String>但是setter使用String[]

答案 1 :(得分:0)

您尝试做的事情看似合乎逻辑,但它不会那样。

如果你没有得到解决,你可以这样做:

  1. 在控制器的相关方法中,您可以为复选框添加标题列表:

     List<String> allUsers = Arrays.asList("abc","xyz"); // OR generate list dynamically
     model.addAttribute("selectableUsers", allUsers);
    

    如果您正在使用它,请将其添加到ModelAndView。

  2. 将您的html更改为@Jakub Ch。

  3. 的建议
  4. 按如下方式更改您的getter和setter方法:

    private String users;
    
    ...
    
    public String getUsers() {
       return this.users;
    }
    
    public void setUsers(String users) {
        this.users = users;
    }  
    
  5. 然后&#39;用户&#39;字段将包含逗号分隔的字符串值或其ID号(取决于您如何设置它)指示所选复选框。然后,您可以使用如下代码将String值转换为数组,或者如果存储了id号,则从ArrayList获取String值。

    public List<String> getStrings() {
        return Arrays.asList(strings.split(","));
    }
    

    希望它有所帮助。

相关问题