
[英]Thymeleaf, Spring nested backing object is not binding the values on form submit
[英]Thymeleaf nested object form binding not generating good input name
我有以下对象结构:
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
?
任何帮助是极大的赞赏。
根据百里香春天的文档 :
表单标签中的
th:object
属性值必须是仅指定模型属性名称的变量表达式(${...}
),而不能进行属性导航。 这意味着像${seedStarter}
这样的表达式是有效的,但${seedStarter.data}
是无效的。
尝试在表单之前使用 th:with
属性来分配A.objB
变量,因此,请避免在th:object
属性中使用属性导航。
似乎要遵守此要求,您必须在处理初始表单呈现的Spring控制器的handler方法中设置一个附加的model属性。 因此,假设您在代码的某些部分中已经有了类似的内容:
model.addAttribute("A", new A());
添加另一行:
model.addAttribute("bForm", new B());
请记住,要使模型属性名称与您在问题中发布的提交请求处理程序中在@ModelAttribute
批注中设置的名称保持一致。
也许答案很晚,但是如果objectB是A的内部对象,则可以将字段绑定为B的内部对象,并在控制器中处理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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.