2011-11-30 52 views
0

我有一个Person类有两个属性:nameaddress。我想建立一个GSP页面,允许一次创建10个用户。这是我如何实现它,并想知道是否有更好的方法:如何从GSP页面创建多个域对象

首先,在GSP页面中制作20个文本框 - 使用someperson.name和10使用someperson.address字段名称(使它们成为循环或代码他们都是单独的,并不重要)。

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

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

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

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

回答

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

+0

Grails知道如何将'person'从请求绑定到命令对象?我期望的参数需要'人[0] .name =鲍勃' – zoran119

+0

我不断收到'错误发生创建命令对象。'和'异常消息:索引:1,大小:0“用这段代码http://pastie.org/2951846任何想法为什么? – zoran119

+0

看看这个问题的答案http://stackoverflow.com/questions/5677623/grails-command-object-data-binding –