当前位置: 代码迷 >> java >> Spring MVC 和 Thymeleaf - 迭代多个项目时 th:value 和 th:field 之间有什么区别?
  详细解决方案

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

热度:65   发布时间:2023-07-31 11:45:05.0

我想使用 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>

我在正确的轨道上吗? 你能解释一下为什么吗? 以及字段和值之间的区别?

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

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

一旦进入<form>标签,就不能指定其他th:object属性。 这与 HTML 表单不能嵌套的事实是一致的。

th:field设置th:fieldnameidvalue 所以它们在某种程度上是可互换的,但您应该尽可能使用th:field因为它提供了与 spring 的额外集成,并且适用于所有类型的输入——但这些实际上只在您编辑页面上的单个对象时有用。

由于您有多个要迭代的对象,因此您必须像正在执行的操作一样手动设置nameidvalue

  相关解决方案