2

有没有一种简单的方法可以在表单顶部而不是每个字段上方对表单错误进行分组?

这是我的 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>

}

我有一个自定义验证,我正在检查唯一的电子邮件地址,并基于该验证,我在全局错误中添加了一个错误。我希望将任何其他错误(由于验证其他字段而引发)与表单顶部的此错误组合在一起。有什么建议么?

4

2 回答 2

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>
}

就像我提到的那样,这不是最优雅的解决方案,但它应该在页面顶部列出您的错误。

于 2012-09-11T20:50:19.040 回答
1

我在将自定义全局错误添加到 globalErrors 并将它们显示在视图上时也遇到了问题。我的解决方案是使用错误对象并在“全局”键下添加这些全局错误。然后在视图中,我在顶部显示所有“全局”错误。

我的观点:

@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));
于 2014-10-12T17:15:34.457 回答