从输入(Thymeleaf)字段到值列表参数的动态绑定

时间:2020-08-31 14:41:44

标签: java html spring thymeleaf

我试图让我着迷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)'。

谁能想到一种将用户输入写回到业务对象的解决方案?否则,我必须想到一个“拐杖”,比如重组我的业务对象。

预先感谢, 斯蒂芬

1 个答案:

答案 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>

希望您有这个主意。请查看herehere以获得完整的示例。

更新

知道了。在这种情况下,您必须利用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>

与您的要求不完全匹配,但是您可以看一下类似的示例herehere