【问题标题】:Dynamic binding from input (Thymeleaf) field to list of values parameter从输入(Thymeleaf)字段到值参数列表的动态绑定
【发布时间】:2020-09-04 23:45:41
【问题描述】:

我正试图深入了解 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", new 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 )}"' 显然不能工作因为它必须是“(类型,值)”之类的东西,但我也不能写“myBusObj.value(类型)”。

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

提前致谢, 斯蒂芬

【问题讨论】:

    标签: java html spring thymeleaf


    【解决方案1】:

    如果我理解正确,您正试图找到一种使用 Thymeleaf 处理枚举的方法。访问枚举值的正确语法(例如,在下拉列表中)您需要像这样使用它:

    <option th:each="myitem : ${T(your.package.YourEnum).values()}"
    
    th:value="${myitem.name()}" th:text="${myitem.name()}"></option>
    

    同样,您可以在 for-each for &lt;td&gt; 中执行此操作,如下所示:

    <td th:each="type : ${T(your.package.YourEnum).values()}">
      ......
    </td>
    

    希望你有这个想法。请查看herehere 以获得全面的示例。

    更新:

    知道了。在这种情况下,您必须使用 Thymeleaf 提供的 rowStat 来跟踪迭代。

    但请确保您的 bean 中有该字段作为集合类型“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

    【讨论】:

    • 嗨,Ajay,这不是真正的问题。读取枚举完全没有问题。但我想使用单个枚举值作为参数将输入元素中的值写回 bean(参见顶部的业务对象框架“setValue()”。
    • 更新了我的回答斯蒂芬。尝试并分享结果。
    • 嗨,阿杰,非常感谢您的努力!我以前见过这些概念,但它并没有真正触及我面临的问题:您的代码行使用此赋值写入输入字段的值: th:field="${yourbeanobj.beanFieldCollection[${rowStat. index}].beanFiled}" 这正是重点,我没有“beanField”。我将不得不写类似 th:field="${yourbeanobj.beanFiled( beanFieldCollection[${rowStat.index}], value )}" 但是我不能显式访问“值"(用户在输入字段中输入的数据)。
    • 我想到这样真的不可能。我必须想办法解决。就像不写回 bean 而是写到“本机”字段中,或者为集合中的所有值显式编码 beanFields 等等。我确实有替代方案的想法,但它们都不是很优雅。
    猜你喜欢
    • 2016-05-23
    • 1970-01-01
    • 2022-01-23
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 2021-08-15
    相关资源
    最近更新 更多