2

我有 html 来发回一个表单,如下所示:

@(message: String)

@main("Contact") {
<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/contact.css")">
<div id="pageContainer">
    <div id="form">
        <div id="topText">
            <p>Have a question or need some assistance? Let us know and we'll get back to you ASAP.</p>
        </div>
        <br/>
        <form method="POST" action="@routes.Home.contact()">

            <div id="contactInfo">
                <label class="contactLabel">First Name:</label><input type="text" name="firstName" id="firstName" class="contactInput" /> <br />
                <label class="contactLabel">Last Name:</label><input type="text" name="lastName" id="lastName" class="contactInput" /> <br />
                <label class="contactLabel">Email:</label><input type="text" name="email" id="email" firstName" class="contactInput" /> <br />
                <label class="contactLabel">Company:</label><input type="text" id="company" name="company" class="contactInput" /> <br />
                <input type="hidden" id="hidden" name = "hidden"></input>
                <p id="crap">@message</p>
            </div>
            <br/>
            <div id="message">
                <label class="contactLabel">Message:</label><textarea cols="50" rows="10"></textarea>
            </div>
            <input type="submit" name="submit" id="submit" value="Submit"></input>
            </form>
    </div>

</div>

}

回到控制器,它看起来像这样:

public static Result contact()
{

    //Map<String,String[]> values = request().body();
    DynamicForm form = form().bindFromRequest();
    String first = "";
    if(form.data().get("firstName") != null)
    first = form.data().get("firstName").toString();

    return ok(views.html.contact.render(first));
}

但是当我查看 的结果时form().bindFromRequest(),它总是空的。我错过了什么吗?

4

3 回答 3

8

这是我将如何做到的:

模板

@(message: String, contactForm: Form[Contact])

@import helper._

@main("Contact") {
<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/contact.css")">
<div id="pageContainer">
    <div id="form">
        <div id="topText">
            <p>Have a question or need some assistance? Let us know and we'll get back to you ASAP.</p>
        </div>
        <br/>
        @form(routes.Home.contact()) {
            <div id="contactInfo">
                <label class="contactLabel">First Name:</label> @inputText(contactForm("firstName"), 'class -> "contactInput"') <br />
                <label class="contactLabel">Last Name:</label> @inputText(contactForm("lastName"), 'class -> "contactInput"') <br />
                <label class="contactLabel">Email:</label> @inputText(contactForm("email"), 'class -> "contactInput"') <br />
                <label class="contactLabel">Company:</label> @inputText(contactForm("company"), 'class -> "contactInput"') <br />
                <input type="hidden" id="hidden" name="hidden"></input>
                <p id="crap">@message</p>
            </div>
            <br/>
            <div id="message">
                <label class="contactLabel">Message:</label><textarea cols="50" rows="10"></textarea>
            </div>
            <input type="submit" value="Submit" />
        }
    </div>
</div>
}

班级联系方式

public class Contact {
    public String firstName;
    public String lastName;
    public String email;
    public String company;
    // other stuff
}

控制器

public static Result contact() {
    Form<Contact> contactForm = form(Contact.class).bindFromRequest();
    if (contactForm.hasErrors()) {
        // process
    } else {
        // contactForm.get().firstName should be filled with the correct data
        return ok(views.html.contact.render("message", contactForm)); 
    }
}

对你起作用吗 ?您应该查看有关这些主题的 Play2 文档:

  1. JavaForms
  2. JavaForm 助手

编辑

如果你能解释为什么我以前的做法行不通

我不确定,但是我可以在您的代码中看到一个问题,您不必调用data()动态表单,直接使用DynamicForm.get()就足够了,first = form.get("firstName")就足够了。

此外,您可以从DynamicForm Javadoc中看到

获取(java.lang.String 键)

如果提交成功,则获取具体值。

DynamicForm如果没有错误,则后面的内部映射具有值,因此您可以hasErrors在实际从字段中获取具体值之前进行检查。

从我的角度来看,使用form(Contact.class).bindFromRequest()填充 class 实例的样式会更好、更容易Contact,这不用说可以使用 Java 注释来验证字段。

于 2012-12-03T21:24:46.900 回答
0

您必须提供一个RequesttobindFromRequest()方法。例如

 DynamicForm form = form().bindFromRequest(request());

request函数提供Request当前动作的电流。似乎bindFromRequest不会自动绑定当前请求

我遇到了同样的问题,谷歌把我带到了这里,希望对你有帮助。

于 2016-03-26T18:17:39.757 回答
0

也许不是完全相同的问题,但在我开发 Play 2.6 应用程序的 Windows 上,我遇到了类似的问题。绑定不起作用。我的意思是表单的数据字段具有正确的值,但模型的值是空的。这导致没有这样的元素异常:没有值存在。我花了很长时间研究这个。解决这个问题的是清理项目,重新编译并再次运行它。嗯。

于 2018-03-15T13:22:02.900 回答