我有一个Person
类,其中包含两个属性:name
和address
。我想构建一个GSP页面,允许一次创建10个用户。这就是我实现它的方式,并且想知道是否有更好的方法:
首先,在GSP页面中制作20个文本框 - 10个带有someperson.name
和10个带有someperson.address
字段名称(将它们放在循环中或单独编码它们,无关紧要)。< / p>
其次,处理控制器中提交的数据。 someperson
对象具有提交的数据,但结构不太好([name: ['Bob', 'John'], address: ['Address 1', 'Address 2']]
),因此我在此处调用transpose()
以便能够访问name
, address
对{/ p>
然后,使用从上一步获得的对构建Person
个对象列表并验证/保存它们。
最后,如果验证失败(name
不能null
),那么做一些事情......不知道还有什么!我正在考虑将Person
个对象的集合传递给GSP,在那里使用循环迭代它们,如果hasErrors
然后显示它们......不知道如何突出显示验证失败的字段...
那么,有没有更好的方法(我应该问什么是更好的方法)?
答案 0 :(得分:1)
您应该通过声明像这样的命令对象来使用Grails的数据绑定支持
class PersonCommand {
List<Person> people = []
}
如果构造表单以便请求参数的命名如下:
person[0].name=bob
person[0].address=england
person[1].name=john
person[1].address=ireland
数据将自动绑定到此控制器操作的personCommand
参数
class MyController {
def savePeople = {PersonCommand personCommand->
}
}
如果您致电personCommand.validate()
,它可能会在validate()
中的每个Person
上致电people
(我不确定)。如果没有,你可以通过调用
boolean allPersonsValid = personCommand.people.every {it.validate()}
此时您将知道所有Person
实例是否有效。如果不是,则应将PersonCommand
传递回GSP,然后使用Grails标记:
<g:eachError>
<g:hasErrors>
<g:renderErrors>
突出显示错误中的字段。如果您不确定如何使用这些标记来突出显示,我建议您为域类运行grails generate-all
并查看它生成的GSP代码。