18

当我使用 Spring MVC 控制器并通过设置 value 来提交表单时,modelAttribute我丢失了一些未映射到表单中的模型字段。在这个例子中,因为我没有映射年龄和地址,所以这些用户的字段丢失了,因此它们具有null价值。我不想让用户更改他们的年龄和地址,这就是为什么这些字段不在表单中。

发布用户编辑表单的方法控制器:

@RequestMapping(value = "/edit", method = RequestMethod.POST)
public String editionUser(Model model, @ModelAttribute("accountForm") User user,
  BindingResult bresult,
  RedirectAttributes redirectAttributes) {
  //user.getAge() and user.getAddress are null           

  //Save the information...
}

获取编辑用户页面的方法控制器:

@RequestMapping(value = "/edit", method = RequestMethod.GET)
public String initEdit(Model model) {
  // the user fields are all filled
  User user = userService.getUserById(...);
  model.addAttribute("accountForm", user);
  return "edition";
}


class User {
  Long id;
  String email;
  String age;
  String address;
  String nickname;

  // ...
}

版本.jsp

<form:form class="form" method="POST" action="edition" modelAttribute="accountForm">
  <form:label path="email">email</form:label>
  <form:input path="email"  name='email'/>
  <form:label path="nickname">nickname</form:label>
  <form:input path="nickname"  name='nickname'/>
  <form:hidden path="id" />
  <input name="submit" type="submit"    value="valid" />  
</form:form>

不失去这些领域价值的最佳解决方案是什么?(年龄和地址)

为每个字段使用表单隐藏路径??在重定向到编辑页面之前将用户存储在会话中,并在发布方法控制器中设置检索用户会话以仅更改修改的字段?有通用方法吗?

4

3 回答 3

8

出于一个简单的原因,我会选择 session:
隐藏的表单字段可以在提交表单之前在客户端轻松操作,因此它们不满足您的要求

请注意,如果不将先前输入的值保存在某处,您甚至无法检测它们是否在客户端被篡改,因此绝对不能选择隐藏字段。
使用会话。

于 2013-11-13T14:36:46.897 回答
4

这是一个旧帖子,但也许答案会帮助像我这样的春季新手

不幸的是,除非您使用,否则您@SessionAttributes({"attributeName"})将失去对象的其他属性。

这篇文章解释了它Spring MVC - 将变量从一页传递到花药

于 2014-07-04T18:13:58.277 回答
2

在这里查看我的答案:

是否可以使用带有 JPA 的 Spring MVC 仅更新实体上的属性子集?

这应该为您完成这项工作。不幸的是,没有更优雅的方法。

附带说明一下,Spring WebFlow 似乎设法仅使用帖子中的字段来更新模型。可能它将模型存储在会话中,并且仅更新 POST 中包含的值。

于 2014-01-10T14:39:27.413 回答