【问题标题】:grails add validation error to hasErrorsgrails 将验证错误添加到 hasErrors
【发布时间】:2015-07-30 19:28:45
【问题描述】:

我想知道如何向 hasErrors 方法添加自定义错误,以便 gsp 识别错误。到目前为止我的代码。

def recoverySetup = new RecoverySetup(params)

def onesolOrgkey = OnesolOrgkeyInfo.get(new OnesolOrgkeyInfo(params));

if(onesolOrgkey != null) {
    recoverySetup.setOneSolOrgkey(onesolOrgkey)
} else {
    recoverySetup.errors.reject('orgkey', 'You must provide a valid Org Key')
}

recoverySetup.validate()

if(recoverySetup.hasErrors()) {
    render view: 'create', model: [recoverySetupInstance: recoverySetup]
    return
}

【问题讨论】:

  • 为什么不在 RecoverySetup 域对象上添加自定义验证器规则?
  • 有一个数据库查询检查 onesolOrgKey 是否为空。我不确定 id 是如何在域对象中做到这一点的。
  • 您可以在您的 src 文件夹中模仿它,并设置发生在 bean 上的所有内容及其验证的一部分,而不是使用实际的 domainObject,例如:return errors.rejectValue(propertyName,"invalid.$propertyName ",[''] as Object[],'') github.com/vahidhedayati/grails-bean-validation-examples/blob/… 其中验证 bean 中的 propertyName 是字段名称,它将在 gsp 中表示,然后您需要通过 gsp 检查匹配它
  • 我很抱歉,但我对 grails 很陌生,我没有关注你。
  • stackoverflow.com/questions/14038905/… 可能会有所帮助,您需要 gsp 元素和控制器/验证方法来绑定字段

标签: grails groovy


【解决方案1】:

正如 Danilo 所说,您可能希望为您的域类添加一个约束来为您执行此操作。

详细了解http://grails.github.io/grails-doc/2.2.x/guide/single.html#constraintshttp://grails.github.io/grails-doc/2.2.x/ref/Constraints/Usage.html 中的约束。

如果出于某种原因您真的想添加一个无法被约束覆盖的自定义错误(我现在无法想象一个案例,但这并不意味着它不存在:-),您可以仍然以与您发布的内容非常相似的方式进行:

instance.errors.rejectValue(fieldName, errorCode, message, defaultMessage)
instance.errors.reject(errorCode, message, defaultMessage)

第一个拒绝具体字段,第二个拒绝一般的 bean。但请记住当您再次调用 validate 时,此错误将被重置

此外,您可以使用以下命令在 grails 中自动显示 bean 的错误:

<g:hasErrors bean="${instance}">
   <g:renderErrors bean="${instance}" />
</g:hasErrors>

在此处查看所有选项:https://grails.github.io/grails-doc/2.2.x/ref/Tags/hasErrors.html

【讨论】:

  • 我只会添加: instance.errors.reject(errorCode, message, defaultMessage) 其中 message 是您的对象绑定到错误代码.. 所以 instance.errors.reject('invalid.date. range.error', [date1,date2] as Object[], "日期范围 ${date1} - ${date2} 无效")。这现在将查找 invalid.date.range.error=Invalid input {0} {1} dates invalid.. 或 messages.properties 中的某些内容
【解决方案2】:

您的域类可能如下所示:

class RecoverySetup {
    String someField
    static hasOne = [oneSolOrgkey: OneSolOrgkey]

    static constraints = {
        oneSolOrgkey nullable: false
    }
}

这样你声明RecoverySetup 的每个实例只有在定义了oneSolOrgkey 时才有效。

一旦你有一个 RecoverySetup 实例,你可以通过调用返回布尔值的 validate() 方法来检查它是否有效:

if (recoverySetupInstance.validate()) {
    // do something with a valid object
}
else {
    recoverySetupInstance.errors.allErrors.each {err ->
        println err // Print errors
    }
}

如果您将实例传递给视图,您将在recoverySetupInstance.errors 中看到所有可用的错误,并且您可以根据需要显示错误。

【讨论】:

    【解决方案3】:

    您的问题我想知道如何向 hasErrors 方法添加自定义错误,以便 gsp 获取错误 有点封闭,因为它特别提到了 hasErrors 作为你想要的方式。

    另一种更简单的方法是在返回 gsp 之前在控制器中创建一个 flash 消息

    flash.error = 'You must provide a valid Org Key'
    render view: 'create', model: [recoverySetupInstance: recoverySetup]
    return
    

    然后在你的 gsp 中,一个块显示 flash.error ...

    <g:if test="${flash.error}">
    <div class="errors" role="status">${flash.error}</div>
    </g:if>
    

    这非常适用于那些您不一定要构建到对象中的业务规则验证,例如当我想防止用户不小心将重复项添加到在其他情况下可能允许重复项的表中时,我使用了它。

    【讨论】:

    • 这种方法的缺点是它阻止了进一步的验证并且只通知这个错误。向 object.errors 添加错误消息将允许立即通知用户所有验证错误。
    猜你喜欢
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 2018-05-15
    相关资源
    最近更新 更多