问题描述
我想使用 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楼
最重要的是,您只能在基本模型属性上同时使用th:object
和th:field
。
这意味着您不能在迭代时使用它(因为${item}
不存在于模型中,它是由th:each
生成的变量)。
这些要求阐明了:
表单标签中
th:object
属性的值必须是变量表达式 (${...}
),仅指定模型属性的名称,没有属性导航。 这意味着像${seedStarter}
这样的表达式是有效的,但${seedStarter.data}
不是。一旦进入
<form>
标签,就不能指定其他th:object
属性。 这与 HTML 表单不能嵌套的事实是一致的。
th:field
设置th:field
的name
、 id
和value
。
所以它们在某种程度上是可互换的,但您应该尽可能使用th:field
因为它提供了与 spring 的额外集成,并且适用于所有类型的输入——但这些实际上只在您编辑页面上的单个对象时有用。
由于您有多个要迭代的对象,因此您必须像正在执行的操作一样手动设置name
、 id
和value
。