因此,当用户点击列表屏幕上的“创建”时,我正在开发一个Web应用程序,它会将他们带到一个页面,在那里他们必须输入一些信息,然后他们点击" next"并且它会将它们带到另一个gsp页面,在那里他们必须为两个域输入数据,但是没有数据存储在表中但是当他们点击"创建"按钮,一切都存储在数据库中 我在寻找例子但却找不到任何例子。 我知道如何调用记录并编辑它,因为所有域或表共享id号,所以我可以用它来检索数据。但我的问题是当我从第一个gsp屏幕转移到另一个我要保存实例然后当用户点击创建时,数据转到三个表
任何想法怎么做?我还是初学者并且正在努力学习 谢谢
答案 0 :(得分:0)
这听起来有点令人困惑,你想做什么,我不确定我完全理解。因为你想改变整个页面,但是,不要丢失那些以前的答案,对吧?您有什么特别的理由想要这样做吗?
我相信您可以将第一个gsp中的所有信息发送到控制器并将所有内容保存在“会话”中(例如session.name = params.name,session.age = params.age),重定向/渲染其他gsp以及稍后,您将从会话中获取信息以及刚刚发布的信息并保存所有内容。这可能不是一个很好的解决方案,但这是我解决这个问题的唯一方法。
:)
答案 1 :(得分:0)
只是一个想法,我直到现在才使用它,但我将来某一天会修改当前应用程序中的对话框流程...:
这不是webflow-plugin的好例子吗?
答案 2 :(得分:0)
这是用于命令对象的内容。每当你有一个要在表单中收集的数据集合然后从中“生成”多个域对象时,就是这样。
我们的想法是创建一个包含您要在表单上收集的所有信息的类。将填充的表单数据发布回控制器保存操作,然后使用命令对象约束验证数据是否已完成。一旦对所有内容感到满意,就可以使用命令对象中的数据来创建/更新域对象。
我们认为使用命令对象是Grails的最佳实践。您可以在命令对象中提供自定义验证支持,以查找和验证数据中与域对象难以处理的关系。我们经常在命令类中编写工厂方法来生成新的或更新的域对象,这使得它非常便于单元测试。
有关详细信息,请参阅手册中“Web图层”的“命令对象”部分。在Grails 2中,命令对象是具有@Validateable注释的类,在Grails 3中,它们实现Validateable特征。如果将命令类声明为控制器中的内部类,则它可以自动验证。我们发现我们更喜欢在src / groovy中声明它们而不是内部类,因为对于不熟悉代码的人来说,它们更容易找到。
答案 3 :(得分:0)
因此,在所有这些答案中,你都有答案,但诚实地说,我认为这远远超出了你自己的理解。
假设您将此示例作为表单
http://code.runnable.com/UevQr3zfd_oaAAGn/jquery-ui-tabs
在标签1上,您有
Name
Age
在标签2上,您有
Address
Postcode
然后你有两个域类
Class User {
String name
String age
Address address
}
Class Address {
String address1
String postcode
}
因此,用户具有名称年龄并且也绑定到地址,而地址具有地址1和邮政编码
现在你的控制器动作
def save(MyBean bean) {
Address address = new Address(bean.loadAddress()).save()
User user = new User()
def userMap = bean.loadUser()
user.age=userMap.age
user.name=userMap.name
//The above object that got saved first
user.addresss=address
user.save()
render "hopefully this should have saved it as expected"
}
在src/main/groovy/yourPackage/MyBean.groovy
package yourPackage
import grails.validation.Validateable
Class MyBean implements Validateable{
String name
String age
Address address
String address1
String postcode
//Now declare your constraints like your domainClass add validator where required to add additional verification/validation to your objects sent back
//This will return all the objects required as a map to save address domain class
protected Map loadAddress() {
Map results=[:]
results.with {
address1=address1
postcode=postcode
}
return results
}
//this will return the user object
protected Map loadUser() {
Map results=[:]
results.with {
name=name
age=age
}
}
}
其他相当复杂的验证bean示例: PhotosBean CustomerChatBean ScheduleBaseBean
正如我所说的那样,我认为作为一个初学者,这可能需要一段时间来解决问题,但希望提供的内容现在会变得更加清晰
<强> E2A 强> 真的很复杂!!我可以有两个gsp屏幕而不是jquery选项卡
这没有多大意义。
你可以有两个动作,只是将params传递给第二个gsp?
所以
def TestController {
def index() {
render view: page1
}
//where page 1 is the first form and submits to action2
//action2 picks up parmas from page1
def action2() {
render view: page2, model:[params:params]
}
}
在page2.gsp中你有
<g:form action="action3">
<g:hiddenField name="originalName" value="${params.originalValue}"/>
<g:hiddenField name="originalName2" value="${params.originalValue2}"/>
<g:hiddenField name="originalName3" value="${params.originalValue3}"/>
Then your actual form content
这样做的问题是action2需要验证从page1收到的params吗?如果是这样,它需要渲染原始页面或page2取决于。
提交到第2页后,最终用户可以篡改hiddenFields,因此验证的内容现在可能无效。您将需要某种形式的方法来重新验证所有这些。
使用上面的验证方法,您可以调用validate()函数,或者可以构建一些md5检查初始值与现在从page2发送的内容。
无论哪种方式,如果你不关心验证,只是想看到它的工作,那么上面是最简单的方法。
我可以使用两个gsp屏幕而不是jquery标签
在第1页中,您可以<g:include action="page2">
并在第一个包含第二个gsp,但在所有诚实中,第1页可能只包含1个页面中的两个操作。这就是为什么它没有意义