我试图让我着迷Thymeleaf和一些仍然很简单的形式,但是无法使它起作用...
我有一个业务对象,该对象存储一些按枚举分类的值(内部实现不在此问题范围内):
public class MyBusObj {
public static enum MY_TYPE {A, B, C };
public int getValue( MY_TYPE type ) { ... }
public void setValue( MY_TYPE type, int value ) { ... }
}
当我将该对象的实例传递给模型时,例如 'model.addAttribute(“ myBusObj”,新的MyBusObj());' 它到达模板级别,并且我可以访问所有内部可用的值(showTypes基本上是MY_TYPE或它的子集作为数组):
<td th:each="type : ${showTypes}">
<input type="number" th:value="${myBusObj.getValue( type )}" th:field="${myBusObj.setValue( type )}"/>
</td>
它显示一行编辑框,每个值对应一个。这就是我想要实现的目标,并且它是动态的,因为如果我添加更多类型,则将自动显示“ D”类型的新框。
虽然从业务对象指向的方向很好->视图可以很好地工作,因为'getValue(type)'可以得到正确的值,而'th:field =“ $ {myBusObj.setValue(type}}”“'显然不能工作因为它一定是类似'(type,value)'的东西,但是我也不能写'myBusObj.value(type)'。
谁能想到一种将用户输入写回到业务对象的解决方案?否则,我必须想到一个“拐杖”,比如重组我的业务对象。
预先感谢, 斯蒂芬
答案 0 :(得分:0)
如果我理解正确,则您正在尝试找到一种使用Thymeleaf处理枚举的方法。访问枚举值的正确语法(例如,在下拉列表中),您需要像这样使用它:
<option th:each="myitem : ${T(your.package.YourEnum).values()}"
th:value="${myitem.name()}" th:text="${myitem.name()}"></option>
类似地,您可以在<td>
的for-each中进行操作,如下所示:
<td th:each="type : ${T(your.package.YourEnum).values()}">
......
</td>
希望您有这个主意。请查看here和here以获得完整的示例。
更新:
知道了。在这种情况下,您必须利用Thymeleaf提供的rowStat来跟踪迭代。
但是请确保您的bean中的字段为Collection类型“ AND” 应该具有与您的枚举对象匹配的大小。
然后您可以执行以下操作:
<td> <select th:name="${yourbeanobj.beanFieldCollection[__${rowStat.index}__].beanFiled}" th:field="${yourbeanobj.beanFieldCollection[__${rowStat.index}__].beanFiled}" th:errorclass="is-invalid" multi>
<option value="abc">Iterate Your Enum List Here</option>
</select>
</td>