我有这个非常复杂的形式。所有的领域都必须填补,但填补的过程可以得到保存,继续进行。所以我需要的是,当最终确认按下时,所有的数据都得到验证。但因为它已经保存到数据库调用validate()不会工作。我用save(validate:false)保存数据,因为当工作仍在progremm中时我不需要验证。圣杯确认已经保存到数据库的数据
如何验证已保存到数据库的数据?我必须手动执行吗?
我有这个非常复杂的形式。所有的领域都必须填补,但填补的过程可以得到保存,继续进行。所以我需要的是,当最终确认按下时,所有的数据都得到验证。但因为它已经保存到数据库调用validate()不会工作。我用save(validate:false)保存数据,因为当工作仍在progremm中时我不需要验证。圣杯确认已经保存到数据库的数据
如何验证已保存到数据库的数据?我必须手动执行吗?
当您验证一个已经存在的对象时会发生什么? 有没有办法让它在检索之后和验证之前显得很脏?
我已经编辑了更详细的解释表单封装的答案,通常可能来自表单输入的层级步骤过程或更复杂的迭代对象,需要在别处。首先,如果您只需要一个步骤即可捕获各种信息,然后您很乐意手动处理所有这些信息,并将其存储在不同类别的大量参数转储中,然后查看jquery-ui tabs
。如果您选择使用制表符的动态功能,即<li><a href="someurl">click</li>
然后将内容动态加载到给定的选项卡,那么这也会覆盖单个表单,或者如果您希望在DOM
内更复杂。
无论如何,我编辑的原因并不在它之上,是因为捕捉多层表单更复杂一些。 所以你不得不step 1
是sent params
通过一个controller
这则passed those params
到一个新的gsp
或甚至的东西,belongs
另一个totally different object
内形式的iteration
。 通常,您将结束:
<g:form action=myDomain" action="doThis">
<!-- this is some iteration that belongs to some other class outside of what i am actually trying to do: -->
<g:each in="someObject" var="p">
<g:hiddenField name="form1.firstName" value="${p.firstName}"/>
<!-- in this case hidden -->
<g:hiddenField name="form1.surName" value="${p.surName}"/>
</g:each>
<!-- this is my actual form -->
<g:textField name="username" />
</g:form>
当表单被提交到控制器
Class MyDomainController {
def doThis(MyBean bean) {
save(bean)
}
}
//这是的src/main /常规
import grails.validation.Validateable
//important for some reason it needs entire collections
// have had issues initialising it without .*
import org.apache.commons.collections.*
Class MyBean implements Validateable {
//this is capturing the current form fields
String username
//This is now collecting our form1 fields
List<MyDetailsBean> form1 = ListUtils.lazyList([], { new MyDetailsBean() } as Factory)
//if that had been 1 instance of it or like as mentioned passed from pervious form and called form2
MyDetailsBean form2
static constraints={
username(nullable:false) //, validator: checkSomething)
}
}
这又是在src/main/groovy
并用于最初收集对象的每次迭代:
import grails.validation.Validateable
Class MyDetailsBean implements Validateable {
String firstName
String surName
}
我已经更新了答案,因为我建议将对象封装在一个bean中,而没有任何关于如何去做这样的事情的细节。我希望以上清楚。这一切都在飞行中,但如果经过测试,希望一切都如上所述。
在下次更新后添加说明form2的例子。终于验证你打电话
if (bean.validate() && bean.form2.validate()) {
//all good
}
因为你是它绑定到类的规则,现在可以作为验证过程的一部分被应用的另一个验证类两套。
老答案
很简单地把它的分贝为什么地球上,你会想验证一个验证的输入。不管怎样的解决办法是在Grails的2 src/groovy/package
这是@Validateable
或
Grails的3 validation bean
:src/main/groovy/package
这implements Validateable
class MyDmainBean {
// must declare id
def id
// Then each object in your real domain class
static constraints = {
id (nullable:true,bindable:true)
importFrom MyDomainClass//, exclude: ['field1']
//field 1 is not included but if field 1 was integer
// in actual domain class and BigDecimal in bean
//then exlude it since it won't bind
}
def formatObject(MyDomainClass domain) {
id=domain.id
..
}
}
现在,您可以拨打
MyDomain record = MyDomain.get(0L)
MyDmainBean bean = new MyDmainBean().formatObject(record)
bean.validate()
也许你需要另一个表来存储临时数据,临时数据是未验证的数据('确认'未按下) – Nico