Thymeleaf th:field不绑定输入文本的值

时间:2019-02-22 09:00:24

标签: spring-boot thymeleaf

我想将一个对象发送到视图以进行展示,并使用springboot和Thymeleaf将其发送回控制器,但是,我遇到了Thymeleaf的th:value怪异的问题。

这是我的控制者:

@GetMapping("/food/buy/{fid}")
public String buyFood(HttpServletRequest request, @PathVariable("fid") Long fid, Model model) {
    Food food = consumerService.getFood(fid);
    System.out.println("foodid = " + food.getId());
    model.addAttribute("food", food);
    model.addAttribute("order", new OrderVO());
    return "user/direct/f_order";
}

和我的观点:

<form th:action="@{/user/buy/direct/food}" method="post" th:object="${order}">
    <table border="1px">
        <tr th:hidden="true">
            <td><input type="text" th:value="${food.id}" th:field="*{fid}" th:readonly="true"></td>
        </tr>
    </table>
</form>

和VO类:

public class OrderVO {
    private Long fid, address;

    private Integer amount;

    @DateTimeFormat(pattern = "HH:mm")
    private Date deliverTime;
}

问题是,输入字段的值为null,但我确定食物的id不为null(我在控制器中将其打印出来)

我删除了th:field块,并且food.id可以正确显示。如果我重新添加th:field块,则会再次出现该问题。

所以th:field可能有问题,但我不知道。有人可以指出我的错误吗?

===========================更新=================== =========

一些朋友友善地指出th:field可能会覆盖th:value,但我也将其用在其他视图中,效果很好:

<tr>
    <td>UserName</td>
    <td><input type="text" th:value="*{userName}" th:field="*{userName}"></td>
</tr>

问题正在变得越来越怪异:(

3 个答案:

答案 0 :(得分:0)

用fid替换* {fid} 我的团队也遇到了同样的问题,并且有效

答案 1 :(得分:0)

以表格形式尝试使用th:name而不是th:field来解决绑定问题

th:name="|order.fid|"

并遵循Java命名约定。

答案 2 :(得分:0)

假设您必须收集对页面的评论。除注释外,您还必须将页面名称发送给控制器。当然,用户不必重新输入此页面的名称。该信息必须传递给控制器​​,但是th:field仅映射用户输入的值,而不映射默认情况下生成的值。
但是您可以将此页面的名称作为URL中的参数传送给控制器。 在html中,您有类似的内容:

    <form  th:action="@{/saveComment(lastPage=${lastPage})}" th:object="${comments}" method="post" enctype="multipart/form-data">
        <div class="row">
 .................................................................................
            <h2>Enter your comment</h2>
            <textarea  th:field="${comments.comment}" rows="10" cols="100" name="comment" id="comment"></textarea>
            <label for="comment">Your comment here</label><br />
            <input type="submit" name ="submit" value="Submit" />
        </div>
    </form> 

In controller, you put stuff like this:

   @PostMapping("/saveComment")
    public String saveComment(Comments comments, String lastPage) {
        comments.setPage_commented(lastPage);
        commentsRepository.save(comments);
        return "redirect:/";
    }

对我来说很好。