繁体   English   中英

Thymeleaf嵌套对象表单绑定未生成好的输入名称

[英]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.testtest

任何帮助是极大的赞赏。

根据百里香春天的文档

表单标签中的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM