移动ajax视图时如何维护控制器的model和bindingResult

How to maintain the model and bindingResult of the controller when moving the view of ajax

提问人:jadekim 提问时间:9/7/2023 最后编辑:jadekim 更新时间:9/7/2023 访问量:27

问:

我尝试了以下方法。但是,当按 location.href 移动视图时,不会保留 model 和 bindingResult。如何维护模型和bindingResult?也许方法是错误的......

控制器

    @PostMapping("/example")
    @ResponseBody
    public Map<String, Object> example(
            @RequestPart("formRequest") @Validated FormRequest formRequest,
            BindingResult bindingResult,
            @RequestPart(value = "file", required = false) MultipartFile file,
            @RequestPart(value = "files", required = false) MultipartFile[] files,
            Model model
    ) {
        Map<String, Object> response = new HashMap<>();
        
        if (bindingResult.hasErrors()) {
            log.warn("bindingResult={}", bindingResult);
            model.addAttribute("formRequest", formRequest);
            model.addAttribute("formStatus", FormStatus.CREATE);
            response.put("errors", bindingResult.getAllErrors());
            
            response.put("url", "/example");
            return response;
        }

        return response;
    }

formRequest

public record FormRequest(
        Long id,
        @NotBlank
        String content1,
        @NotBlank
        String content2,
        @NotBlank
        String content3,
        @NotNull
        Integer number1,
        @NotNull
        Integer number2,
        @NotNull
        List<GoodRequest> goodRequests,
        @NotNull
        List<DimRequest> dimRequests,
        String category
) {}

阿贾克斯

        $.ajax({
          url: url,
          type: "POST",
          data: formData,
          enctype: "multipart/form-data",
          contentType: false,
          processData: false,
          success: function (response) {
            location.href = response.url;
          }
        });
Java Ajax Spring Model-View-Controller 控制器

评论

1赞 esQmo_ 9/7/2023
当您使用当前页面重定向页面时,将重新加载,并且任何数据存储在模型中或丢失的数据location.hrefBindingResult
1赞 David 9/7/2023
当您将用户导航到新页面时,用户将导航到新页面。就好像用户点击了一个链接,或者在浏览器中手动输入了一个新地址。上一页中的任何内容都将丢失。退后一步......为什么在执行 AJAX 操作后仍要将用户导航到新页面?AJAX 的要点是不需要导航。如果页面导航是目标,那么首先不要使用 AJAX,而只是让用户提交表单。目前还不清楚这里的根本目标是什么。
0赞 jadekim 9/7/2023
@David 添加了表单请求代码。如果你看一下formRequest,有List<GoodRequest>和List<DimRequest>,你必须分别从javascript中收集GoodRequest和DimRequest,并将它们发送到控制器。所以我使用了ajax。

答:

0赞 esQmo_ 9/7/2023 #1

当您使用 重定向页面时,将重新加载当前页面,并将任何数据存储在模型中或丢失。在请求之间维护数据的一种方法是将其存储在会话中或将其作为 URL 参数传递。location.hrefBindingResult

在这种情况下,您可以修改控制器以将 and 对象存储在会话中,然后在呈现视图时从会话中检索它们。修改代码,如下所示:formRequestbindingResult

@PostMapping("/example")
@ResponseBody
public Map<String, Object> example(
        @RequestPart("formRequest") @Validated FormRequest formRequest,
        BindingResult bindingResult,
        @RequestPart(value = "file", required = false) MultipartFile file,
        @RequestPart(value = "files", required = false) MultipartFile[] files,
        Model model,
        HttpSession session
) {
    Map<String, Object> response = new HashMap<>();

    if (bindingResult.hasErrors()) {
        log.warn("bindingResult={}", bindingResult);
        // Store formRequest and bindingResult in the session
        session.setAttribute("formRequest", formRequest);
        session.setAttribute("bindingResult", bindingResult);
        response.put("errors", bindingResult.getAllErrors());

        response.put("url", "/example");
        return response;
    }

    return response;
}

然后,在您的视图中,您可以从会话中检索 和 对象并使用它们。formRequestbindingResult