grails视图中未知数量的模型对象

时间:2013-05-21 14:41:13

标签: grails model webforms

使用Grails 2.2

我有一种情况,我需要能够在视图中处理未知数量的委员会成员。这些都需要创建和显示。

每个人都有通常的属性 - 姓名,地址,联系信息,用户ID。

据我所知,如果我将表单字段命名为相同名称,Grails将返回一个集合供我迭代。然而,在这种情况下,我遇到了这种情况:

cm_firstname

cm_lastname

cm_address

cm_email

cm_userid

这是否意味着我将获得每个领域的集合?这没有用,因为没有办法用正确的姓氏来核心各种名字等。

我很享受Grails,期待您的反馈。

2 个答案:

答案 0 :(得分:1)

您可以使用Grails Command objects为您完成此项工作。这是SO问题中的an example。基本上,您将拥有一个CommitteeMembers的集合,它将在您的控制器数据绑定中填充。

正如@Gregg所说,在视图中你需要字段才能有索引。

class MyDomain {
  String name
}

class MyDomainCommand {
  List<MyDomain> instances = ListUtils.lazyList([], FactoryUtils.instantiateFactory(MyDomain))
}

class MyController {
  def save() {
    MyDomainCommand command = new MyDomainCommand()
    bindData(command, params, [include: 'instances'])
  }
}

答案 1 :(得分:0)

我会告诉你我做了什么,这可能是也可能不是最好的选择。我这样做主要是因为我不喜欢数据绑定。

以你的情况为例,我会命名我的字段:“cm.firstName,cm.lastName,cm.address,cm.email,cm.userId”。

如果您在服务中:

GrailsWebRequest webUtils = WebUtils.retrieveGrailsWebRequest()

List committeeMembers = [].withDefault {new GrailsParameterMap([:], webUtils.getCurrentRequest())}

在控制器中:

List committeeMembers = [].withDefault {new GrailsParameterMap([:], request)}

然后

params.cm.each { k, v ->
    if (v instanceof String[]) {
        v.eachWithIndex { val, idx ->
            committeeMembers[idx]."$k" = val
        }
    }
    else {
        committeeMembers[0]."$k" = v
    }
}

然后你可以这样做:

committeeMembers.each {
    <Create from it.firstName, it.lastName, etc>
}