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. Javaフォーム
  2. JavaForm ヘルパー

編集

以前のやり方がうまくいかなかった理由を説明できれば

それについてはわかりませんが、コードに 1 つの問題があることがわかります。data()動的フォームを呼び出す必要はありません。直接使用するDynamicForm.get()だけでfirst = form.get("firstName")十分です。

DynamicForm Javadocからわかるように

get(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 に答える