是否有一种简单的方法可以在表单顶部对表单错误进行分组,而不是在每个字段上方?
这是我的Scala模板:
@(registrationForm: Form[User])
@implicitField = @{ FieldConstructor(views.html.helper.twitterBootstrap2.twitterBootstrap2FieldConstructor.f) }
@import helper._
@helper.form(action = routes.Registration.index) {
<fieldset>
@if(registrationForm.hasGlobalErrors) {
<div class="alert alert-error">
<a class="close" data-dismiss="alert">×</a>
@registrationForm.globalError.message
</div>
}
<legend>Register</legend>
@inputText(
registrationForm("firstName"),
'_label -> "First Name",
'_showConstraints -> false,
'_showErrors -> true,
'_error -> registrationForm.error("firstName")
)
@inputText(
registrationForm("lastName"),
'_label -> "Last Name",
'_showConstraints -> false,
'_showErrors -> true,
'_error -> registrationForm.error("lastName")
)
@inputText(
registrationForm("emailAddress"),
'_label -> "Email Address",
'_showConstraints -> false,
'_showErrors -> true,
'_error -> registrationForm.error("emailAddress")
)
@inputPassword(
registrationForm("password"),
'_label -> "Password",
'_showConstraints -> false,
'_showErrors -> true,
'_error -> registrationForm.error("password")
)
@inputPassword(
registrationForm("password"),
'_label -> "Confirm Password",
'_showConstraints -> false,
'_showErrors -> true,
'_error -> registrationForm.error("password")
)
</fieldset>
<button type="submit" class="btn">Register</button>
}
我有一个自定义验证,我正在检查唯一的电子邮件地址,并根据该验证,我向全局错误添加错误。我希望在表单顶部将此错误与任何其他错误(由于其他字段的验证而引发)相混淆。有什么建议吗?
答案 0 :(得分:5)
在您的@if(registrationForm.hasGlobalErrors){
中,您总是可以尝试调用registrationForm.globalErrors
来获取所有错误的列表,遍历它,并为每个错误输出消息?
示例:
@if(registrationForm.hasGlobalErrors){
<div class="alert alert-error">
@for(validationError <- registrationForm.globalErrors){
<a class="close" data-dismiss="alert">×</a>
@validationError.message
}
</div>
}
编辑:根据以下评论的要求,我正在更新我的答案,以包括一种用于对自定义验证消息进行分组的替代方法,这可能不是“最佳”解决方案,但应该完成。
在您的控制器中:
if(filledForm.hasErrors()){
for(String key : filledForm.errors().keySet()){
List<ValidationError> currentError = filledForm.errors().get(key);
for(ValidationError error : currentError){
flash(key, error.message());
}
}
}
或者您可以使用迭代器,无论您喜欢哪种。
然后在你看来有些东西:
@if(flash.size() > 0){
<div class="alert-alert error">
@for((key, value) <- flash){
<strong>Error : </strong> @value<br />
}
</div>
}
正如我所提到的,不是最优雅的解决方案,但它应该会在页面顶部显示错误列表。
答案 1 :(得分:1)
我在向globalErrors添加自定义全局错误并在视图上显示它们时也遇到了问题。 我的解决方案是使用errors对象并在“global”键下添加这些全局错误。然后在视图中,我在顶部显示所有“全局”错误。
我的观点:
@for(error <- form("global").errors) {
<p>@error.message</p>
}
我的控制器:
ValidationError error = new ValidationError("global", "User is not authorized.");
List<ValidationError> errors = new ArrayList<ValidationError>();
errors.add(error);
loginForm.errors().put("global", errors);
return badRequest(login.render(loginForm));