2

我正在寻找一种方法来从一个控制器请求映射到另一个进行重定向或转发。

情况是我有一个控制器,它具有三个阶段:用户输入数据 -> 预览页面 -> 提交。在预览请求映射中,我有模型属性及其 BindingResult。如果我在绑定中有错误,我想使用重定向将用户推回新表单,但是当我这样做时,Spring 会重新评估 ModelAttribute,从而重新创建 BindingResult。

一些代码:

@RequestMapping(value = "\new", method = RequestMethod.GET)
@ApplicationUserCreated
public String formNew(
        @ModelAttribute("formBean") FormBean formBean,
        BindingResult bindingResults,
        Model uiModel) {
    // Do some stuff

    // Send the "new form" view
    return "new.jsp";
}

@RequestMapping("/preview", method = RequestMethod.POST)
@ApplicationUserCreated
public String formPreview(
        @ModelAttribute("formBean") FormBean formBean,
        BindingResult bindingResults,
        Model uiModel) {
    // TODO: Validate the form
    if(bindingResults.hasErrors()) {
        // Redirect them back to the "New" form
        return "redirect:" + "/new";
    } else {
        return "preview.jsp";
    }
}

请原谅任何拼写错误,因为我不得不尝试简化一些代码。我尝试从 formNew() 方法中删除 BindingResults,但是当 Preview 重定向到 New 时,它似乎仍然会覆盖 BindingResults。我也尝试过“前进”,但结果相同。

4

3 回答 3

1

当我需要将用户发送回 new.jsp 时,我最终只是从formPreview()调用了formNew() 。我没有得到重定向,所以浏览器中的 URL 显示为“/preview”,但至少它可以工作,我觉得我没有浪费时间复制代码。

于 2013-02-07T17:58:12.167 回答
0

您可以将 BindingResult 存储在 Session 中,或者您可以尝试使用Spring Flash Attributes发送该数据,如果您至少有 spring 3.1 的话。

** 如果 ManagementMovesFormBean 扩展或实现您是 FormBean,您应该在 flash 属性中发送该 bean。

** 顺便说一句,为了验证你的表单,你应该在 @ModelAttribute(".....

不要忘记将 BindingResult 分配给单个类,在您的示例中,您有 2 个具有不同预期对象的方法,因此这两个 BindingObjects 是不同的

于 2013-01-17T15:58:32.000 回答
0

我不确定预览页面的目的是什么,但我建议在同一页面上执行验证,并且只有在输入有效时才能继续使用重定向进行预览。

于 2017-01-03T21:21:09.580 回答