Thymeleaf 地图表单绑定

Posted

技术标签:

【中文标题】Thymeleaf 地图表单绑定【英文标题】:Thymeleaf Map Form Binding 【发布时间】:2016-02-28 04:12:14 【问题描述】:

db.html

<div th:each="pr, stat: *mergeMap">
    <tr>
        <td><input type="text" name="key" th:value="$pr.key" /></td>
        <td><input type="text" name="value" th:value="$pr.value" /></td>
    </tr>
</div>

在提交此输入时,我总是在 Spring Controller 中让 mergeMap 为空。应该怎么做才能得到mergeMap的值?

Controller.java

@RequestMapping(value = "/shot")
    public String saveMergeProducts(@ModelAttribute(value="prod") MergedProductInfoDTO prod, BindingResult bindingResult, 
            Model model, HttpServletRequest request) 
        System.out.println(prod.toString());
        return "forward:/backoffice/db";
    

HTML

<form action="#" th:action="@shot" method="POST" th:object="$prod">
            <tr>
            <td><span th:text="$index.index"></span></td>
                <td><input type="text" name="id" th:value="*id" th:readonly="readonly" /></td>
                <td><input type="text" name="categoryName" th:value="*categoryName" th:readonly="readonly" /></td>
                <td><input type="text" name="subCategoryName" th:value="*subCategoryName" th:readonly="readonly" /></td>
                <td><input type="text" name="productBrand" th:value="*productBrand" /></td>
                <td><input type="text" name="productSubBrand" th:value="*productSubBrand" /></td>
                <td><input type="text" name="series" th:value="*series" /></td>
                <td><input type="text" name="model" th:value="*model" /></td>
            </tr>
        <tr>
            <td colspan="7">
                            <tr>
                                <th>KEY</th>
                                <th>VALUE</th>
                            </tr>
                            <div th:each="pr, stat: *mergeMap">
                                <tr>
                                    <td><input type="text" name="mergeMapKey" th:value="$pr.key" /></td>
                                    <td><input type="text" name="mergeMapValue" th:value="$pr.value" /></td>
                                </tr>
                            </div>
                        </table>
                    </td>
                    <td><input type="text" name="tags" th:value="*tags" /></td>
                    <td><input type="submit" value="Submit" /></td>
                </tr>

【问题讨论】:

【参考方案1】:

要访问表单支持 bean 的 Map 属性,请使用 __$...__ 预处理器

<div th:each="pr, stat: *mergeMap">
    <tr>
        <td><input type="text" name="value" th:value="$pr.key" readonly="true"/></td>
        <td><input type="text" name="value" th:field="*mergeMap[__$pr.key__]"/></td>
    </tr>
</div>

它的作用是在评估整个表达式之前先评估内部表达式。请注意,在这种情况下,不应修改 $pr.key,以便更新将反映到绑定到表单的 bean 的 map 属性。

参考:http://www.thymeleaf.org/doc/tutorials/2.1/thymeleafspring.html#dynamic-fields

【讨论】:

mergeMap 值未填充到 thymeleaf ui 中。 地图应预先填充键。这些键将用于相应地更新地图中的值。 map 同时包含 key 和 value,我该如何填充它的值呢?

以上是关于Thymeleaf 地图表单绑定的主要内容,如果未能解决你的问题,请参考以下文章

Spring_借助Thymeleaf实现表单绑定

Spring-Boot Thymeleaf 绑定枚举在隐藏字段

Thymeleaf模板引擎语法

隐藏字段值空白 Thymeleaf

迭代 Thymeleaf 中的地图列表

@ModelAttribute 使用 thymeleaf 返回空值