grails:只对一个字段/属性进行自定义验证

时间:2013-05-22 09:40:52

标签: forms validation grails

我有一个“Thing”域类,其中每个Thing都有一个记录号(不是自动生成的id),用户将用它来访问Thing:

class Thing {
  ...
  String recordNumber
  ...
}

有一个表格可以查找Thing,知道它的recordNumber:

<g:form action="search">
    <input name="recordNumber">
    <g:submitButton name="btn" value="go to this Thing"/>
</g:form>

我想在此表单中使用验证过程:如果找不到recordNumber(Thing.findByRecordNumber(recordNumber) == null),则输入字段必须为红色,并且工具提示必须显示错误消息“记录号不找到”。

据我所知/读过(我是grails新手),这必须写成Thing类中的约束:

static constraints = {
    recordNumber validator: { n -> Thing.findByRecordNumber(recordNumber) }
}

问题是:我没有以这种形式填充所有“Thing”属性,只有recordNumber属性,所以我就是无法调用

new Thing(params).validate()

如何仅在一个字段上调用验证,而不是在整个对象上调用验证?

2 个答案:

答案 0 :(得分:3)

如果这是你的主要问题,虽然我在那里看到其他人:

“如何只在一个字段上调用验证,而不是在整个对象上调用验证?”

您可以传递值列表进行验证,它只会验证这些属性

new Thing(params).validate(["recordNumber"])

http://grails.org/doc/latest/ref/Domain%20Classes/validate.html

答案 1 :(得分:0)

验证是针对域类属性的约束。您需要在控制器中执行操作:

def search = {
    if(params.recordNumber && Thing.findByRecordNumber(params.recordNumber)){
       redirect(action: "show", params:[id:Thing.findByRecordNumber(params.recordNumber).id])
    }else{
       flush.message = "No record found"
       render(view:'VIEW_WITH_SEARCH_FORM')
    }
}

如果您想在不刷新页面的情况下进行验证,请编写一个javascript代码。