我正在为 Spring 在 POST 期间处理表单支持对象的方式而苦苦挣扎。正如预期的那样,在 html 表单中具有相应输入标记的 ScreenObject 属性在帖子中仍然存在。但是如果一个属性没有输入标签,就会出现两种情况:
- 如果属性作为请求参数传入,它会在帖子中继续存在。
- 如果属性未作为请求参数传入,则它不会在帖子中存活。
这是我的代码。
屏幕对象
private Integer hostSiteSectionId; // no input tag but survives if passed as a request param
private String name; // input tag so survives
private String orderFactor; // input tag so survives
private Integer hostSiteId; // no input tag but survives if passed as a request param
private String hostSiteName; // no input tag and not passed as request param so does not survive
得到
@RequestMapping(method=RequestMethod.GET)
public ModelAndView edit(@RequestParam(value="hostSiteId", required=false) Integer hostSiteId, @RequestParam(value="hostSiteSectionId", required=false) Integer hostSiteSectionId, Locale locale) {
HostSiteSectionHeaderEditScreenObject screenObject=new HostSiteSectionHeaderEditScreenObject();
initializeScreenObject(hostSiteId, hostSiteSectionId, screenObject, locale, true);
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("screenObject", screenObject);
modelAndView.setViewName(WebView.HOST_SITE_SECTION_HEADER_EDIT_PAGE.getViewName());
return modelAndView;
}
POST 取消
@RequestMapping(method=RequestMethod.POST, params="cancel")
public String cancel(@ModelAttribute("screenObject") HostSiteSectionHeaderEditScreenObject screenObject) {
// logic that returns redirect
}
我的 initializeScreenObject() 方法只设置 screenObject 的属性。它不适用于模型。我看不出它会如何干扰,所以我没有发布它的基本代码。
在这篇文章中,它在其他文章中的工作方式相同,screenObject 具有以下内容:
- 用户通过输入标签在表单中提供的所有输入都存在。没有任何问题。
- 仅当 getter url 将其作为参数包含在 screenObject 中时 hostSiteId(无输入标记)才存在(例如,edit?hostSiteId=2)
- 仅当 getter url 将其作为参数包含在 screenObject 中时 hostSiteSectionId(无输入标记)才存在(例如,edit?hostSiteSectionId=2)
- 所有其他没有相应输入标签且未作为请求参数传入的属性为空。
为了进一步说明#4。我有一个在 initializeScreenObject() 方法中设置的 screenObject.hostSiteName 属性。使用 正确呈现视图<td>${screenObject.getHostSiteName()}</td>
。现在我单击取消提交控件。当控制器接管提交时,该属性为空。
请解释这是否是预期的。如果预期,请解释如何去做。我想,我可以为那些需要在帖子中生存的属性添加隐藏的表单字段,但这有点小技巧。我希望有更好的答案。以及原始请求参数如何在后期操作中成为焦点..?