Grails 如何从GSP页面创建多个域对象

Grails 如何从GSP页面创建多个域对象,grails,Grails,我有一个Person类,它有两个属性:name和address。我想建立一个GSP页面,它允许同时创建10个用户。这就是我实施它的方式,我想知道是否有更好的方法: 首先,在GSP页面中创建20个文本框,其中10个包含someperson.name,10个包含someperson.address字段名(将它们放在一个循环中或单独编码,无所谓) 其次,在控制器中处理提交的数据。someperson对象具有提交的数据,但结构不太好([名称:['Bob','John',地址:['address 1','

我有一个
Person
类,它有两个属性:
name
address
。我想建立一个GSP页面,它允许同时创建10个用户。这就是我实施它的方式,我想知道是否有更好的方法:

首先,在GSP页面中创建20个文本框,其中10个包含
someperson.name
,10个包含
someperson.address
字段名(将它们放在一个循环中或单独编码,无所谓)

其次,在控制器中处理提交的数据。
someperson
对象具有提交的数据,但结构不太好(
[名称:['Bob','John',地址:['address 1','address 2']]
),因此我在此调用
transpose()
,以便能够访问
名称
地址

然后,使用从上一步获得的成对对象构建
Person
对象的列表,并验证/保存它们

最后,如果验证失败(
name
不能为
null
),请执行某些操作。。。还不知道是什么!我正在考虑将
Person
对象的集合传递给GSP,在GSP中使用循环进行迭代,如果
hasrerrors
则显示它们。。。不知道如何突出显示验证失败的字段


那么,有没有更好的方法(我可能应该问什么是更好的方法)?

您应该通过声明这样的命令对象来使用Grails的数据绑定支持

class PersonCommand {

  List<Person> people = []
}
数据将自动绑定到此控制器操作的
personCommand
参数

class MyController {

  def savePeople = {PersonCommand personCommand->

  }
}
如果您调用
personCommand.validate()
它可能会依次调用
people
中每个
人的
validate()
(我不确定)。如果不行,你可以自己打电话

boolean allPersonsValid = personCommand.people.every {it.validate()}
此时,您将知道所有
Person
实例是否有效。如果没有,您应该将
PersonCommand
传递回GSP,您可以使用Grails标记:


突出显示错误中的字段。如果您不确定如何使用这些标记来突出显示,我建议您为域类运行
grails generate all
,并查看它生成的GSP代码。

grails如何知道将
person
从请求绑定到命令对象?我希望参数作为
people[0]是必需的。name=bob
我在创建命令对象时不断遇到
错误。
异常消息:Index:1,Size:0
使用此代码知道原因吗?看看这个问题的答案
boolean allPersonsValid = personCommand.people.every {it.validate()}