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