【问题标题】:Grouping form errors in Play! FrameworkPlay 中的分组表单错误!框架
【发布时间】:2015-01-26 10:03:31
【问题描述】:

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

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

}

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

【问题讨论】:

    标签: playframework


    【解决方案1】:

    在您的@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>
    }
    

    编辑:应下面 cmets 的要求,我正在更新我的答案,以包括一种用于对自定义验证消息进行分组的替代方法,这可能不是“最佳”解决方案,但应该可以做到这一点。

    在您的控制器中:

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

    正如我所提到的,这不是最优雅的解决方案,但它应该在页面顶部显示一个大的错误列表。

    【讨论】:

    • 我试图分组的错误似乎没有被放入全局错误中。如果我将请求绑定到表单的实例,这就是我得到的... Form(of=class models.User, data={lastName=User, emailAddress=test@example.com, firstName=Test, password=}, value=None, errors={password=[ValidationError(password,error.required,[])]})
    • 抱歉,我想我读到您已经将错误添加到您的全局错误中。我想另一种方法是在进行自定义验证时,您始终可以将错误添加到控制器中的 Flash 范围,然后检查视图中的 Flash 并输出您添加的所有 ValidationErrors 以及相应的消息。如果这看起来像是您想走的路线,我可以编辑我的答案以反映这一点,尽管我不确定这是“最正确”的方式。
    • 感谢您的回复。我实际上是 Play 新手!框架;但是,我使用了其他框架,在表单顶部对错误进行分组是相当简单的,所以我很好奇我是否只是遗漏了一些东西。如果您有使用过的解决方案,如果您将其放入答案中,我将不胜感激。谢谢!
    【解决方案2】:

    我在将自定义全局错误添加到 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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 1970-01-01
      • 2018-10-26
      相关资源
      最近更新 更多