如何在单个表单中混合多个域对象?

时间:2011-01-31 20:18:31

标签: data-binding grails groovy grails-domain-class grails-controller

我有3个域名: - 资格包含 - 资格排除 - EligibilitySummary

我还构建了eligibility.gsp(混合使用3个模板:_inclusion,_exclusion,_summary;我还使用JQueryUI选项卡在一个选项卡中呈现每个域)。

一切都很适合查看,但现在我只想使用一个控制器来创建,编辑,列表和显示 如何通过一个控制器处理3个域? (例如,我想使用EligibilityController来处理我的3个域名)

最佳用法是什么:
- 绑定多个objets? - 使用命令对象?

2 个答案:

答案 0 :(得分:2)

不幸的是,命令对象对视图的输入模型没有帮助,它们专门用于帮助输出模型来绑定和验证请求参数。但是,如果您准备深入研究某些元编程以实现创建视图模型的数据绑定,则可以基于命令对象滚动自己的视图模型。
这是一个基本方法。以下代码构造命令对象,然后您可以将其作为模型传递给控制器​​中的视图:

class ItemCommand {
 // attribute declarations ...

public void bindData(def domainInstance){
    domainInstance.properties.keySet().each { prop ->
        if(prop == "class"){
            // not needed
        } else if(prop == "metaClass") {
            // not needed
        } else if(this.properties.containsKey(prop)){
            this."${prop}" = domainInstance."${prop}"
        }
    }
}

这将允许您通过为每个域对象调用bindData来绑定来自不同域对象的数据。

这是我使用的解决方案的本质。如果您打算对域对象进行更新,则需要将不同域对象(和版本属性)的ID存储为隐藏字段。

答案 1 :(得分:0)

你不能只提交多个对象,如果其中一些具有相同的字段名,对吧?

我尝试将3个对象加入到具有3个字段的单个Command中,例如:inclusionInstance1, inclusingInstance2, summaryInstance1和gsp-s中的名称字段,如name='command.inclusionInstance1.name'。提交表单时,分配command.properties = params应该有效。