我想使用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>
我走对了吗?你能解释为什么吗?字段和值之间的区别?
答案 0 :(得分:1)
最重要的是,您只能在基本模型属性上同时使用th:object
和th:field
。这意味着您不能在迭代时使用它(因为模型上不存在${item}
,这是th:each
生成的变量)。要求说明如下:here:
表单标签中
th:object
属性的值必须是仅指定模型属性名称的变量表达式(${...}
),而不能进行属性导航。这意味着像${seedStarter}
这样的表达式是有效的,而${seedStarter.data}
则不是。一旦在
<form>
标记内,就无法指定其他th:object
属性。这与HTML表单不能嵌套的事实相符。
th:field
设置字段的name
,id
和value
。因此它们在某种程度上是可以互换的,但是您应该尽可能使用th:field
,因为它提供了与spring的额外集成,并且可以处理各种输入-但这些仅在您在页面上编辑单个对象时才有用
由于要迭代的对象很多,因此必须像手动一样手动设置name
,id
和value
。