我想通过几种形式收集域类的数据。我想初始化一个域的实例,通过表单页面(将收集的数据分配给实例的属性)并在最后一个表单成功完成后保存实例。
有没有办法在没有webflow的情况下执行此操作?
答案 0 :(得分:0)
有没有办法在没有webflow的情况下执行此操作?
您可以使用hidden
字段来完成此操作。但我可能更喜欢你使用Webflows。
以下是使用Webflow的一些优点:
1)您有两个新的范围flow
和conversation
允许您存储在流程中访问的变量
2)你有简单的DSL来保持整洁
3)由于有flow
范围,你可以这样做:
flow.someThing = new YourClassName(params) //places object in flow scope
请记住:
1)如果你使用流范围的对象,你的类需要实现Serializable
类。
2)从Grails 1.2开始,您需要明确安装Webflow
插件。文件说:
从Grails 1.2开始,Webflow不再是Grails的核心,所以你 必须安装Webflow插件才能使用此功能:grails install-plugin webflow
(见here)。
答案 1 :(得分:0)
作为Ant评论的替代方案,您可以使用session
,但存储非域对象或简单的Map。这肯定会带来很多额外的复杂性,并且webflows 做提供了很多防止意外后退按钮等的保护。
粗略的想法:
grails-app/domain
中的
class Widget {
String name
int id
// constraints, etc
}
grails-app/controllers
中的
class WidgetCommand {
// setup your command
}
class WidgetController {
def savePage1 = { WidgetCommand cmd ->
// validate, etc
def widget = session.tempWidget ?: [:]
widget.putAll(cmd.properties)
session.tempWidget = widget
[widget: widget]
}
def savePage2 = { WidgetCommand cmd ->
// etc
}
def savePage3 = {
// or something similar here
def finalWidget = new Widget(session.tempWidget)
finalWidget.save()
}
}
您可以尝试将实际的域对象直接存储在内存中,但我相信如果您正在编辑对象(而不是新对象),它将自动保存在会话结束时,您将不得不重新链接它到Hibernate会话。