我有以下对象结构:
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对象传递给我的视图,我想为我的B对象创建一个表单:
<form id="bForm" th:object=${A.objB} th:action="@{/save}">
<input th:field=*{test} type="text"/>
</form>
但是上面的代码会起作用,它会生成如下的输入名称:objB.test
为此我的控制器无法将它绑定到B对象。
这是我控制器中的接收方法:
@RequestMapping("/save")
@ResponseBody
public String setB(@ModelAttribute("bForm") B b, BindingResult result) {
aService.setB(b);
return "...";
}
如何设置Thymeleaf为我的字段命名而不添加前缀,而不是:objB.test
只是test
?
非常感谢任何帮助。
答案 0 :(得分:1)
表单标记中
${...}
属性的值必须是变量表达式(${seedStarter}
),仅指定模型属性的名称,不带属性导航。这意味着像${seedStarter.data}
这样的表达式有效,但th:with
不会。
尝试在表单前使用 A.objB
属性来分配th:object
变量,从而避免在model.addAttribute("A", new A());
属性中使用属性导航。
似乎要遵守这个要求,你必须在Spring控制器的处理初始表单呈现的处理程序方法中设置一个额外的模型属性。因此,鉴于您的代码的某些部分已经有类似的内容:
model.addAttribute("bForm", new B());
添加另一行:
@ModelAttribute
请注意,保留模型属性名称与您在提交请求处理程序中t.test(sam.a,sam.b, var.equal = TRUE)$p.value
#[1] 0.01819264
注释中设置的名称一致。
答案 1 :(得分:0)
也许是一个迟到的答案,但如果objectB是A的内部对象,那么你可以将字段绑定到B作为A的内部对象并处理控制器中的objectA。
它看起来像这样,但在我的情况下,提示符是包含对象的Arraylist:
<th:block th:each="pr, stat : ${taskExecution.prompt}">
<input type="hidden" id="hiddenName" th:field="*{prompt[__${stat.index}__].name}" th:value="${pr.name}">
<input type="hidden" id="hiddenValue" th:field="*{prompt[__${stat.index}__].value}" th:value="${pr.value}">
</th:block>