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>