【问题标题】:How to create multiple domain objects from a GSP page如何从 GSP 页面创建多个域对象
【发布时间】:2011-11-30 12:58:15
【问题描述】:

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

首先,在 GSP 页面中创建 20 个文本框 - 10 个带有 someperson.name 的文本框和 10 个带有 someperson.address 字段名称的文本框(将它们放在一个循环中或单独编码,没关系)。

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

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

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

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

【问题讨论】:

    标签: grails


    【解决方案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(),它可能会依次在people 中的每个Person 上调用validate()(我不确定)。如果没有,您可以自己调用

    boolean allPersonsValid = personCommand.people.every {it.validate()}
    

    此时您将知道是否所有Person 实例都有效。如果不是,您应该将 PersonCommand 传递回 GSP,然后您可以使用 Grails 标签:

    • &lt;g:eachError&gt;
    • &lt;g:hasErrors&gt;
    • &lt;g:renderErrors&gt;

    突出显示错误的字段。如果您不确定如何使用这些标签进行高亮显示,我建议您为域类运行grails generate-all 并查看它生成的 GSP 代码。

    【讨论】:

    • Grails 如何知道将请求中的person 绑定到命令对象?我希望参数是people[0].name=bob
    • 我不断收到Error occurred creating command object.Exception Message: Index: 1, Size: 0这个代码pastie.org/2951846知道为什么吗?
    • 看看这个问题的答案stackoverflow.com/questions/5677623/…
    猜你喜欢
    • 1970-01-01
    • 2021-08-09
    • 2014-07-20
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 2015-06-07
    • 2011-07-14
    • 2023-04-02
    相关资源
    最近更新 更多