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

发布于 2024-10-15 04:28:08 字数 311 浏览 8 评论 0原文

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

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

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

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

I have 3 domains :
- EligibilityInclusion
- EligibilityExclusion
- EligibilitySummary

I build also eligibility.gsp (mix use of 3 templates : _inclusion, _exclusion, _summary ; and I'm also using JQueryUI tab to render each domain in one tab).

Everything fine for viewing, but now I would like to use only one controller to create, edit, list and show.
How can I handle 3 domains via only one controller?
(for example, I would like to use EligibilityController to handle my 3 domains)

What is the best usage:
- binding multiple objets?
- use command objects?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

您的好友蓝忘机已上羡 2024-10-22 04:28:08

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

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(以及版本属性)存储为隐藏字段。

Unfortunately command objects don't help with the input model for a view, they are specifically designed to aide the output model for the binding and validation of request parameters. However you can roll your own View Model based on a command object if you are prepared to delve into some meta programming to to achieve the data binding for the creation of the view model.
Here's a basic approach. The following code constructs the Command Object which you can then pass as the model to the view in the controller:

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}"
        }
    }
}

This will allow you to bind the data from different domain objects by calling bindData for each of the domain objects.

This is the essence of the solution I use. You will need to store the ids of the different domain objects (and the version attribute) as hidden fields if you intend to do updates to the domain objects.

月寒剑心 2024-10-22 04:28:08

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

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

You can't just submit multiple objects, if some of them have same field names, right?

I'd try to join the 3 objects into single Command with 3 fields, like: inclusionInstance1, inclusingInstance2, summaryInstance1, and name fields in gsp-s respectively, like name='command.inclusionInstance1.name'. Assigning command.properties = params should work when submitting the form.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文