我有以下对象结构:
public class A{
private int id;
private B objB;
public A(){}
--- setters & getters ---
}
这是我的 B 类:
public class B{
private int id;
private int test;
public B(){}
--- setters & getters ---
}
我将一个 A 对象传递给我的 View ,我想为我的 B 对象创建一个表单:
<form id="bForm" th:object=${A.objB} th:action="@{/save}">
<input th:field=*{test} type="text"/>
</form>
但是上面的代码可以工作,它会生成这样的输入名称:objB.test
为此,我的 Controller 无法将它绑定(bind)到 B 对象。
这是我 Controller 中的接收方法:
@RequestMapping("/save")
@ResponseBody
public String setB(@ModelAttribute("bForm") B b, BindingResult result) {
aService.setB(b);
return "...";
}
我如何设置 Thymeleaf 以不带前缀的方式命名我的字段,而不是:objB.test
just test
?
非常感谢任何帮助。
最佳答案
Values for
th:object
attributes in form tags must be variable expressions (${...}
) specifying only the name of a model attribute, without property navigation. This means that an expression like${seedStarter}
is valid, but${seedStarter.data}
would not be.
尝试在您的表单之前使用 th:with
属性来分配您的 A.objB
变量,因此避免在 中使用属性导航th:object
属性。
似乎要遵守此要求,您必须在处理初始表单呈现的 Spring Controller 的处理程序方法中设置一个额外的模型属性。因此,假设您的代码的某些部分已经有这样的内容:
model.addAttribute("A", new A());
再添加一行:
model.addAttribute("bForm", new B());
请记住,要使模型属性名称与您在问题中发布的提交请求处理程序的 @ModelAttribute
注释中设置的名称保持一致。
关于spring - Thymeleaf 嵌套对象表单绑定(bind)未生成良好的输入名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32525601/