播放后我遇到了很大困难! 2.2.x文档,我目前仍然坚持如何从表单验证中显示错误。
这是我的代码:
路线
GET /account/create controllers.Account.create()
POST /account/create controllers.Account.createAccount()
模型
public static UserAccount create(UserAccount data){
UserAccount account = data;
String salt = BCrypt.gensalt();
account.email = data.email;
account.salt = salt;
account.hash = BCrypt.hashpw(data.hash, salt);
account.save();
return account;
}
控制器
// handles POST method
public static Result createAccount(){
Form<UserAccount> userForm = form(UserAccount.class).bindFromRequest();
if(userForm.hasErrors()){
return badRequest();
}else{
UserAccount.create(userForm.get());
Logger.info("Username is: " + userForm.get().email);
return ok("ok, I recived POST data. That's all...");
}
}
// Handles GET method
public static Result create(){
return ok(
views.html.account.form.render()
);
}
浏览
@if(form.hasGlobalErrors) {
<p class="error">
@form.globalError.message
</p>
}
@helper.form(action = routes.Account.createAccount()) {
<input type="text" name="email" placeholder="Your Email Address"/><br/>
<input type="password" name="password" placeholder="Your Password"/><br/>
<input type="text" name="fname" placeholder="Your First Name"/><br/>
<input type="text" name="midname" placeholder="Your Middle Name"/><br/>
<input type="text" name="lname" placeholder="Your Last Name"/><br/>
<input type="text" name="dob" placeholder="Your Birthday"/><br/>
<select name="gender" id="gender">
<option value="1">Male</option>
<option value="2">Female</option>
<option value="3">Undecided</option>
</select><br/>
<input type="submit" value="Login" />
}
错误消息
value hasGlobalErrors is not a member of object views.html.account.form
有谁能告诉我我的代码有什么问题?我对给定的例子感到沮丧。
编辑#1:
这是我到目前为止所做的:
型号:
public static UserAccount create(UserAccount data){
UserAccount account = data;
String salt = BCrypt.gensalt();
account.email = data.email;
account.salt = salt;
account.hash = BCrypt.hashpw(data.hash, salt);
account.save();
return account;
}
控制器:
// HANDLES GET REQUEST
public static Result create(){
return ok(
views.html.account.form.render(userForm)
);
}
// HANDLES POST REQUEST
public static Result createAccount(){
Form<UserAccount> userForm = form(UserAccount.class).bindFromRequest();
if(userForm.hasErrors()){
return badRequest(views.html.account.form.render(userForm));
}else{
// UserAccount.create(userForm.get());
// Logger.info("Username is: " + userForm.get().email);
UserAccount data = userForm.get();
return ok(data.email);
}
}
查看/ TEMPLATE
@(form: Form[UserAccount])
@if(form.hasGlobalErrors) {
<h1>Please fix the following error first</h1>
<p>
@form.globalError.message
</p>
<ul>
@for(error <- form.globalErrors) {
<li>@error.message</li>
}
</ul>
}
@helper.form(action = routes.Account.createAccount()) {
<input type="text" name="email" placeholder="Your Email Address"/><br/>
<input type="password" name="password" placeholder="Your Password"/><br/>
<input type="text" name="fname" placeholder="Your First Name"/><br/>
<input type="text" name="midname" placeholder="Your Middle Name"/><br/>
<input type="text" name="lname" placeholder="Your Last Name"/><br/>
<input type="text" name="dob" placeholder="Your Birthday"/><br/>
<select name="gender" id="gender">
<option value="1">Male</option>
<option value="2">Female</option>
<option value="3">Undecided</option>
</select><br/>
<input type="submit" value="Login" />
}
到目前为止,根据firebug,当我故意在表单上放错误时,服务器将返回badrequest。但是,模板不会显示错误。
如果我改变控制器:
public static Result createAccount(){
Form<UserAccount> userForm = form(UserAccount.class).bindFromRequest();
if(userForm.hasErrors()){
return ok(userForm.errorsAsJson().toString());
}else{
// UserAccount.create(userForm.get());
// Logger.info("Username is: " + userForm.get().email);
UserAccount data = userForm.get();
return ok("ok, I received POST data. That's all...");
}
}
或者如果我在我的视图/模板上执行此操作
<pre>@form.errorsAsJson.toString()</pre>
它有效,并且相应地打印错误。有谁知道我在这里缺少什么?
编辑#2:
对我来说输出错误的最好方法是在我的视图/模板上执行此操作
@(form: Form[UserAccount])
@if(form.hasErrors) {
<h1>Please fix the following error first</h1>
<ul>
@for(error <- form.errors) {
<li>@error.toString</li>
}
</ul>
}
哪个输出:
(email,[ValidationError(email,error.required,[])])
(hash,[ValidationError(hash,error.required,[])])
由于我试图向用户显示适当的消息,因此该消息毫无用处。
答案 0 :(得分:1)
您可以使用闪存范围:
控制器:
public Result create(){
flash("error", "error msg");
return badRequest(view.render());
}
查看:
@flash.get("error")
问题是您的表单没有“全局错误”,它对字段email和hash有错误。这是不同的。
您可以使用以下方法检查字段的错误:
@if(form.error("email") != null) { }
你可以在控制器上发出全局错误:
form.reject("global error");
更多信息: http://www.playframework.com/documentation/2.0/JavaSessionFlash
答案 1 :(得分:1)
在深入研究您的代码之后,有两点需要注意:
在模板中,您需要为表单字段使用帮助程序标记。帮助者将为您显示特定于字段的错误:http://www.playframework.com/documentation/2.2.x/JavaFormHelpers
我认为您的表单没有任何全局错误,这就是代码没有显示任何内容的原因。
尝试帮助,看看它是否适合你。
答案 2 :(得分:0)
我需要查看完整的模板,控制器和路由文件。我认为问题是你的模板文件顶部没有方法签名,如下所示:
@(userForm: Form[User])
修复模板后,您还遇到另一个问题,即您没有将表单传递给“badRequest()”流程中的视图模板。尝试将控制器操作更改为:
public static Result createAccount(){
Form<UserAccount> userForm = form(UserAccount.class).bindFromRequest();
if(userForm.hasErrors()){
return badRequest(views.html.createUserTemplate.render(userForm));
}else{
UserAccount.create(userForm.get());
Logger.info("Username is: " + userForm.get().email);
return ok("ok, I recived POST data. That's all...");
}
}
您的全局错误代码大多是正确的,它应如下所示:
@if(userForm.hasGlobalErrors) {
<ul>
@for(error <- userForm.globalErrors) {
<li>@error.message</li>
}
</ul>
}