20

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

我看到很多人都陷入了同样的困境,我决定创建一个问题和一个答案来处理它。

4

2 回答 2

39

第 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')}则将字符串添加到 html 类中。error此类可用于设置输入样式以及显示和/或隐藏div.error-messages块。将<g:renderErrors bean="${command}" as="list" field="idNumber"/>显示一个可怕的错误消息。

第 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'
})

现在,这将传递对视图的引用,指向您在 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']
})
于 2012-12-26T09:59:12.863 回答
2

进行自定义验证的替代方法是创建自定义约束并将其与 Grails 连接。

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

于 2012-12-27T07:46:41.320 回答