Return 在 Play 框架中连续提交表单失败后返回上一页

Return to previous page after continuous unsuccessful form submissions in Play framework

我想在我的 PlayFramework Java 控制器中获取上一页的 URL。我知道可以通过以下方式获得它:

String refererUrl = request().getHeader("referer");

但想象一下包含一个带有“保存”和“取消”按钮的表单的页面。如果用户按下保存按钮,表单将在控制器中进行控制,如果存在一些错误,则会转到同一页面并要求用户更正表单。

现在假设用户没有正确输入数据,因此他返回表单进行更正。现在用户再次不更正表格并第二次按“保存”。因此它将再次重定向到表单。现在如果用户按下取消,它将转到最后一页,这是有错误的表单,这不是我想要的。

一种方法是将前面的 URL 作为页面的参数。但我真的不喜欢长 URLs,所以有没有其他解决方案?

您可以将引荐来源网址传递到模板中:

控制器动作:

public Result something() {
   String refererUrl = request().getHeader("referer");
   return ok(views.html.something.render(refererUrl));
}

然后您可以为 'cancel' 按钮创建一个条件。

模板:

@(referer: String)

@if(referer.equals("THE_URL_YOU_DONT_WANT_TO_REDIRECT") {
   <a href="the page you would like him to redirect"> cancel </a>
} else {
   <a href="@referer"> cancel </a>
}

您可以使用 Ajax 表单提交请求并在 JavaScript 中进行重定向。通过这种方式,您可以根据您的请求决定是否正确或有错误,重定向或仅使用表单验证错误更新页面。

您的表单可能如下所示:

<form id="myForm" method="post" action="/">

  <!-- My input -->

  <button type="button">Cancel</button>
  <input type="submit" value="Save">
</form>

在你的 JavaScript 中:

$("#myForm").submit(function(event) {
  event.preventDefault();
  $.ajax({
    type: 'POST',
    url: "mySubmitURL",
    data: $('#myForm').serialize(), 
    success: function(response) {
        // Redirect to the new page
    },
    error: function(response) {
        // Show your errors that you submitted in the response
    }
  });
});

现在您需要一个控制器来处理 POST 请求和 returns 表单错误 JSON 以防出现以下情况:

public Result mySubmitURL() {
    Form<MyModel> form = Form.form(MyModel.class)
            .bindFromRequest();
    if (form.hasErrors()) {
        return badRequest(form.errorsAsJson());
    }
    // Do something with your form data, e.g. store it
    return ok();
}