【问题标题】:How do I create a custom validator with a custom error message in Grails?如何在 Grails 中创建带有自定义错误消息的自定义验证器?
【发布时间】:2012-12-11 21:53:43
【问题描述】:

如何在 grails 中创建自定义验证器并将自定义字符串传递回视图和错误消息?

我看到这么多人陷入同一个问题,我决定创建一个问题和一个答案来处理它。

【问题讨论】:

    标签: grails validation custom-errors


    【解决方案1】:

    第 1 步:创建域对象或命令对象并在其上放置自定义约束,因此...

    @grails.validation.Validateable
    class PeopleCommand {
    
        String  firstName 
        String  lastName
        String  emailAddress
        String  idNumber
    
        static constraints = {
            firstName (blank: false)
            lastName  (blank: false)
            emailAddress  (blank: false)
            idNumber  (blank: false, size: 13..16, validator: {value, object ->
                    if (!value.startsWith('77')) return false;
            })
        }
    }
    

    这将检查您输入的 idNumber 是否以 77 开头。如果不是,则会发送错误。下一个问题,我们如何显示错误?

    第 2 步:自定义视图以显示您的错误

    <div class="${hasErrors(bean:person,field:'idNumber','error')}">
        <label class="control-label">Identity Number</label>
        <input value="${fieldValue(bean:person,field:'idNumber')}" name="idNumber" type="text"/>
        <div class="error-messages">
            <g:renderErrors bean="${command}" as="list" field="idNumber"/>   
        </div>
    </div>
    

    在上面的示例中,如果人员模型对象的 idNumber 字段有错误,${hasErrors(bean:person,field:'idNumber','error')} 会将字符串 error 添加到 html 类中。此类可用于设置输入样式并显示和/或隐藏div.error-messages 块。 &lt;g:renderErrors bean="${command}" as="list" field="idNumber"/&gt; 将显示一个可怕的错误消息。

    第 3 步:创建性感的自定义消息

    重要提示:Grails 不允许您直接向 看法。相反,您必须在 /i18n/messages.properties(消息包)中声明消息。你可以使用任何你喜欢的键。

    在messages.properties中

    validation.idStartsWith77=Your ID number must start with 77
    

    在验证器中

    idNumber  (blank: false, size: 13..16, validator: {value, object ->
        return 'validation.idStartsWith77'
    })
    

    现在这会将 reference 传递给视图,指向您在 messages.properties 中的自定义消息...

    第 4 步:破解系统以允许将消息直接传递到视图

    这仅适用于专门开发多语言网站的人。

    Grails 允许您将自定义参数传递给解析器。您可以在消息文件中引用这些自定义参数。为了欺骗系统,我们可以创建一个自定义消息,其中整个消息是一个自定义参数。因此:

    在messages.properties中

    validation.customRuntimeMessage={3}
    

    在验证器中

    idNumber  (blank: false, size: 13..16, validator: {value, object ->
        return ['validation.customRuntimeMessage', 'You need to start your ID with 77']
    })
    

    【讨论】:

    • 这太棒了!现在我的字段显示自定义错误消息。 但是,它还显示来自messages.properties 文件的默认错误消息。例如,我在验证器中自定义了 null 消息,当我运行代码时,我得到了自定义消息和 default.null.message。如何使默认消息不显示?!谢谢!
    • @AlwaysAnovice 答案在这里:stackoverflow.com/questions/4922611/…
    【解决方案2】:

    自定义验证的替代方法是创建自定义约束并将其与 Grails 关联。

    http://www.zorched.net/2008/01/25/build-a-custom-validator-in-grails-with-a-plugin/

    【讨论】:

    • 哇,这令人印象深刻,但对于我的需求来说,PT 太多了 :)
    猜你喜欢
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多