我有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()
的结果时,它总是空的。我错过了什么吗?
答案 0 :(得分: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文档:
修改强>
如果你能解释为什么我以前做的方式没有工作
我不确定,但我可以在代码中看到一个问题,您无需在动态表单上调用data()
,直接使用DynamicForm.get()
就足够了,所以{ {1}}就足够了。
此外,您可以从DynamicForm Javadoc
中看到get(java.lang.String key)
如果提交成功,则获取具体值。
如果没有错误,first = form.get("firstName")
后面的内部地图会有值,因此您可以在实际从字段中获取具体值之前与DynamicForm
核对。
从我的观点来看,使用填充类hasErrors
的实例的form(Contact.class).bindFromRequest()
样式会更好更容易,这不用说可以使用Java注释验证字段。
答案 1 :(得分:0)
您必须提供Request
到bindFromRequest()
方法。例如
DynamicForm form = form().bindFromRequest(request());
request
函数为当前操作提供当前Request
。
似乎bindFromRequest
没有自动绑定当前的请求
我遇到了同样的问题,谷歌把我带到了这里,希望它有所帮助。
答案 2 :(得分:0)
也许不完全相同的问题,但在我的Windows开发Play 2.6应用程序我有类似的问题。绑定不起作用。我的意思是Form的数据字段有适当的值,但模型的值是空的。这导致没有这样的元素异常:没有值存在。我花了很长时间研究这个问题。修复问题的原因是清理项目,重新编译并再次运行它。 EHH。