Spring MVC和Thymeleaf-迭代多个项目时th:value和th:field有什么区别?

时间:2019-02-13 18:45:34

标签: java spring thymeleaf

我想使用HTML表单从数据库到Thymeleaf视图显示多个项目,以便我可以更改和更新数据库。

我打算使用 th:field 。但发生错误。当我尝试使用 th:value 时。并显示数据。

<div th:each="item : ${courses}">
  <form th:object="${item}">
    <input th:field="*{name}" type="text" id="name" name="name" /> // error occur
  </form>
</div>

跟随错误。

Neither BindingResult nor plain target object for bean name 'item' available as request attribute

下面的代码可以正常工作。

<div th:each="item : ${courses}">
  <form th:object="${item}">
    <input th:value="*{name}" type="text" id="name" name="name" /> // ok
  </form>
</div>

我走对了吗?你能解释为什么吗?字段和值之间的区别?

1 个答案:

答案 0 :(得分:1)

最重要的是,您只能在基本模型属性上同时使用th:objectth:field。这意味着您不能在迭代时使用它(因为模型上不存在${item},这是th:each生成的变量)。要求说明如下:here

  

表单标签中th:object属性的值必须是仅指定模型属性名称的变量表达式(${...}),而不能进行属性导航。这意味着像${seedStarter}这样的表达式是有效的,而${seedStarter.data}则不是。

     

一旦在<form>标记内,就无法指定其他th:object属性。这与HTML表单不能嵌套的事实相符。

th:field设置字段的nameidvalue。因此它们在某种程度上是可以互换的,但是您应该尽可能使用th:field,因为它提供了与spring的额外集成,并且可以处理各种输入-但这些仅在您在页面上编辑单个对象时才有用

由于要迭代的对象很多,因此必须像手动一样手动设置nameidvalue