【问题标题】:bindFromRequest() not working in play framework 2.0. Form values are always nullbindFromRequest() 在 play framework 2.0 中不起作用。表单值始终为空
【发布时间】:2022-04-01 16:54:50
【问题描述】:

问题是,我无法在 play framework 2.0 中读取提交表单中的值。该值始终为空,

这是我的代码:

我的模型文件

 package model;

 public class Paper {
    public String query;
 }

我的 index.scala.html

@(myform: Form[model.Paper])

@helper.form(action =routes.Application.newPaper()) {
   myvalue:  @helper.inputText(myform("query"))  <br><br>
   <br><input type="submit">
}

配置/路由

 POST     /newkey                  controllers.Application.newPaper()
 GET     /                           controllers.Application.index()

我的 Application.java

  public static Result index() {
    Paper paper = new Paper();
    paper.query = "initial value";
    Form<Paper> paperForm =  Form.form(Paper.class).fill(paper);
    return ok(index.render(paperForm);
  }

  public static Result newPaper() {
    Form<Paper> paperForm = Form.form(Paper.class).bindFromRequest();
    if (!paperForm.hasErrors()) {
        Paper paper = paperForm.get();
        Logger.info("query= " + paper.query); //why I always get "query= null" ???
    }
    return redirect(routes.Application.index()); 
 }

当我访问html页面时,在文本输入框中看不到“初始值”。当我填写输入框并单击提交按钮时,打印的日志始终为:query= null

我还使用 chrome devtool 进行了监控。我看到 post http 请求已发送。但最终状态码是 303,而不是 200。

如果我在 newPaper() 中使用 DynamicForm 处理提交的表单,那么我可以按预期读取查询值。但是为什么当前的代码不起作用?

感谢您的帮助!

【问题讨论】:

    标签: java playframework playframework-2.0


    【解决方案1】:

    您还需要在带有值 post 的表单标签中指定方法属性。但是辅助方法不支持方法属性。所以就这样做吧。

    @(myform: Form[model.Paper])
    
    <form method="POST" action ="@routes.Application.newPaper()"> 
       query:  @helper.inputText(myform("query"))  <br><br>
       <br><input type="submit">
    </form>
    

    【讨论】:

    • method 属性由action attr 中使用的route 确定,无需手动使用。
    • 如果您在调试工具的网络选项卡中检查它正在调用的方法会更好。我之前也遇到过同样的问题,默认情况下它使用 GET 方法进行调用。
    • 我监控了 http 请求并确认它正在发送 POST 请求。但是最终状态码是303,不知道为什么状态码不是200?
    • 而不是反向路由尝试通过在操作属性中指定值“/newkey”来尝试,如果再次给出 303。然后尝试使用类似 POSTMAN 的一些休息客户端使用此 API。请让我知道结果,也许我可以进一步帮助您。
    【解决方案2】:

    我使用了formFactory 而不是Forms

    myApplication.java 中为bindFormRequest 添加.withDirectFieldAccess(true);

    所以你的代码应该是:

    Form<Paper> paperForm = Form.form(Paper.class).bindFromRequest().withDirectFieldAccess(true);
    

    代替:

    Form<Paper> paperForm = Form.form(Paper.class).bindFromRequest();
    

    通过这个你可以得到所有的字段。 您可以在此链接上找到更多帮助 - https://www.playframework.com/documentation/2.7.x/JavaForms

    【讨论】:

      【解决方案3】:

      我在 2022 年也遇到过这个问题。

      我使用的是 2.8.x 版本,这里是我找到的解决方案。

      案例一。

      如果你在你的模型中写了setters,带有setters的字段会自动填充,应该没有问题。

      案例 2。

      如果您的模型中没有 setters,则应使用以下行:Form.form(Paper.class).withDirectFieldAccess(true).bindFromRequest(reqeust);

      withDirectFieldAccess(true) 的位置在 2.8.x 版本中很重要,您还必须将 request 对象作为参数传递。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-24
        • 2014-10-15
        • 2013-02-28
        相关资源
        最近更新 更多