0

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

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

有一种形式可以查找事物,知道它的记录编号:

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

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

据我所知/阅读(我是 grails 菜鸟),这必须写为 Thing 类中的约束:

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

问题是:我在这个表单中没有要填充的所有“事物”属性,只有 recordNumber 一个,所以我不能调用

new Thing(params).validate()

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

4

2 回答 2

3

如果这是您的主要问题,尽管我在那里看到其他人:

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

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

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

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

于 2013-05-22T10:41:41.537 回答
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 代码。

于 2013-05-22T10:00:36.080 回答