春天Thymeleaf th:在EnumList上选择了多个选项

时间:2018-11-12 09:46:37

标签: spring thymeleaf

我有这个枚举

enum Types{
  A, B
}

我有一个表格课

public class MyForm {
   private Types[] types;
   //getter setters
}

这是我的选择表格

<form th:action="${#httpServletRequest.requestURI}" th:object="${myForm}" method="POST" id="form">

<select name="types" multiple="" id="testSelect"
  th:each="type : ${T(com.test.Types).values()}"
  th:value="${type}" 
  th:text="${type}"
  th:selected="*{types != null AND #arrays.contains(types, type)}"
  >
</select>

</form>

这是我遇到的错误。

 Property or field 'type' cannot be found on object of type 'com.test.MyForm' - maybe not public or not valid?

2 个答案:

答案 0 :(得分:0)

首先,我相信您有错字,应该是type !=,而不是!=。另外,您正在使用所选的*,而不是$。另外,我相信您正在以一种不起作用的方式使用Thymeleaf的#list.contains()。您应该像#list.contains(types, type)这样使用整个函数。最后一件事,selectedvaluetext标签应该放在option元素中,而不是select中。最后,您的代码应类似于以下代码。

<select name="types" multiple="" id="testSelect">
    <option th:each="type : ${T(com.test.Types).values()}"
         th:value="${type}" th:text="${type}"
         th:selected="${types != null AND #arrays.contains(types, type)}">
    </option>
</select>

最后一件事,我不确定变量types的来源,我假设您在某个地方对其进行了初始化。

答案 1 :(得分:0)

最好是将表单支持bean更改为具有一些枚举集合,而不是像这样的数组:

public class MyForm {
  private List<Types> types = new ArrayList<Types>();
  //getter setters
}

然后,在呈现表单之前,只需在数组中填充类型,只需将它们添加到列表中即可在控制器中预先选择它们。

然后应该能够简单地跳过选定的逻辑...

<select th:field="*{types}" multiple="multiple" id="testSelect">
    <option th:each="type : ${T(com.test.Types).values()}"
       th:value="${type}" th:text="${type}">
    </option>
</select>

Thymeleaf会为您做魔术;-)