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

时间:2011-11-30 12:58:15

标签: grails

我有一个Person类,其中包含两个属性:nameaddress。我想构建一个GSP页面,允许一次创建10个用户。这就是我实现它的方式,并且想知道是否有更好的方法:

首先,在GSP页面中制作20个文本框 - 10个带有someperson.name和10个带有someperson.address字段名称(将它们放在循环中或单独编码它们,无关紧要)。< / p>

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

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

最后,如果验证失败(name不能null),那么做一些事情......不知道还有什么!我正在考虑将Person个对象的集合传递给GSP,在那里使用循环迭代它们,如果hasErrors然后显示它们......不知道如何突出显示验证失败的字段...

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

1 个答案:

答案 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代码。

相关问题