Spring mvc 如何保留表单上嵌套对象的属性

Spring mvc 如何保留表单上嵌套对象的属性,spring-mvc,thymeleaf,Spring Mvc,Thymeleaf,我有一个对象,我想动态加载表单字段。实例化和显示字段在显示时可以正常工作,但是,当我尝试提交表单时,除了用户提供的${field.value}之外,所有数据都会丢失。如何保留所有附加属性值 以下是生成表单对象的控制器方法: @RequestMapping(method = RequestMethod.GET) public String newFooForm(@AuthenticationPrincipal UserDetails user, @RequestParam("fooType") S

我有一个对象,我想动态加载表单字段。实例化和显示字段在显示时可以正常工作,但是,当我尝试提交表单时,除了用户提供的
${field.value}
之外,所有数据都会丢失。如何保留所有附加属性值

以下是生成表单对象的控制器方法:

@RequestMapping(method = RequestMethod.GET)
public String newFooForm(@AuthenticationPrincipal UserDetails user, @RequestParam("fooType") String fooType, @RequestParam("isTeam") Boolean isTeam, Model model) {
    Employee currentUser = getCurrentUser(user);
    List<FooFieldDefinition> fooFieldDefinitions = fooFieldDefinitionService.findByOrganizationalUnitIdAndIsTeam(currentUser.getOrgId(), isTeam);
    FooViewModel fooViewModel = new FooViewModel(currentUser, fooType, isTeam, fooFieldDefinitions);
    model.addAttribute("fooViewModel", fooViewModel);
    return "newFooForm";
}
以下是表单的片段:

<form id="foo-form" action="#" th:action="@{/fooForms}" th:object="${fooViewModel}"
      method="post">
    <div th:each="fooField,iterationStatus  : *{fooFields}">
        <label th:text="${fooField.label}">Label</label>
        <input th:type="text" th:field="*{fooFields[__${iterationStatus.index}__].value}"/>
    </div>
    <div style="position: absolute; right: 20px; bottom: 20px;">
        <input class="btn btn-primary" id="save" type="submit" name="save" value="Save"/>
        <input class="btn btn-primary" id="submit" type="submit" name="submit" value="Submit"/>
    </div>
</form>

谢谢你的建议

多亏了这篇文章,我才明白这一点:。建议使用一个隐藏字段。您必须访问页面上呈现的
ViewModel
的属性值,并将其分配给希望传递给
POST
端点的
ViewModel

<form id="foo-form" action="#" th:action="@{/fooForms}" th:object="${fooViewModel}"
      method="post">
    <div th:each="fooField,iterationStatus  : *{fooFields}">
        <label th:text="${fooField.label}">Label</label>
        <input th:type="text" th:field="*{fooFields[__${iterationStatus.index}__].value}"/>
<!-- The fix, this is an example of 1 attribute.  Of course I will extend this for appropriate attribute values -->
        <input th:type="hidden" th:field="*{fooFields[__${iterationStatus.index}__].label}" th:value="${fooViewModel.fooFields[__${iterationStatus.index}__].label}"/>
<!-- End new code -->
    </div>
    <div style="position: absolute; right: 20px; bottom: 20px;">
        <input class="btn btn-primary" id="save" type="submit" name="save" value="Save"/>
        <input class="btn btn-primary" id="submit" type="submit" name="submit" value="Submit"/>
    </div>
</form>

标签
@RequestMapping(method = RequestMethod.POST, params = {"save"})
public String fooFormDraftSubmit(@AuthenticationPrincipal UserDetails user, @ModelAttribute FooViewModel fooViewModel, Model model) {
    Employee currentUser = getCurrentUser(user);
    Foo foo = new Foo(currentUser, fooViewModel);
    fooService.save(foo);
    for (FooField fooField : fooViewModel.getFooFields()) {
       fooFieldService.save(fooField);
    }
    FooViewModel persistedFooViewModel = new FooViewModel(foo);
    model.addAttribute("fooViewModel", persistedFooViewModel);
    return "fooView";
}
<form id="foo-form" action="#" th:action="@{/fooForms}" th:object="${fooViewModel}"
      method="post">
    <div th:each="fooField,iterationStatus  : *{fooFields}">
        <label th:text="${fooField.label}">Label</label>
        <input th:type="text" th:field="*{fooFields[__${iterationStatus.index}__].value}"/>
<!-- The fix, this is an example of 1 attribute.  Of course I will extend this for appropriate attribute values -->
        <input th:type="hidden" th:field="*{fooFields[__${iterationStatus.index}__].label}" th:value="${fooViewModel.fooFields[__${iterationStatus.index}__].label}"/>
<!-- End new code -->
    </div>
    <div style="position: absolute; right: 20px; bottom: 20px;">
        <input class="btn btn-primary" id="save" type="submit" name="save" value="Save"/>
        <input class="btn btn-primary" id="submit" type="submit" name="submit" value="Submit"/>
    </div>
</form>