如何在一个GSP页面中创建多个域对象

  • 本文关键字:创建 对象 一个 GSP grails
  • 更新时间 :
  • 英文 :


我有一个具有两个属性的Person类:nameaddress。我想建立一个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代码。

最新更新