一次提交多个grails域对象

时间:2013-10-16 14:26:07

标签: forms validation grails model-view-controller domain-object

我有一个表单,用户可以在其中输入同一个域类的许多记录。这些记录中的每一个都应在提交后进行验证。如果验证成功,则应将记录集合传递到另一个视图,否则验证错误应显示在同一视图中,同时保留先前输入的值。应使用专用命令对象进行验证。

为了拍出更好的照片,形式大致如下: enter image description here

我想出了一个解决方案,将每个记录映射到一个表单(从呈现视图的初始操作返回项目列表):

<g:each in="${items}" var="item">
    <g:render template="orderItem" model="[item: item]"/>
</g:each>

模板:

<form>
    ...
    <g:textField value="${item.url}" name="url"></g:textField>
    ...
</form>

但我不确定这种方法的正确性。

实施此方案时,我面临的挑战很少:

  1. 有没有更好的方法将每个记录实例映射到视图中的字段行,以便一行字段代表一条记录?
  2. 如何在一次调用控制器操作时传递和验证整个集合?
  3. 提前致谢。

1 个答案:

答案 0 :(得分:4)

您可以使用command objects执行此操作。它们是可以处理域实例列表的可验证对象。例如:

命令

import org.apache.commons.collections.ListUtils
import org.apache.commons.collections.Factory

@Validateable
class ItemsCommand {
  List<Item> items = ListUtils.lazyList([], {new Item()} as Factory)
}

GSP

在您的视图中,您只需要一个表单。创建字段时,请使用索引,如:

<g:each in="${command.items}" var="item" status="i">
  <g:textField name="items[$i].url" value="${item.url}" />
  ...
</g:each>

控制器

//this is the submit action, the command will have the Item 
//instances though Data Binding.
def myAction(ItemsCommand command) {
}

Related SO question.