2

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

为了画得更好,表格大致是这样的: 在此处输入图像描述

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

<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. 如何通过一次调用控制器操作来传递和验证整个集合?

提前致谢。

4

1 回答 1

4

您可以使用命令对象来做到这一点。它们是可以处理域实例列表的可验证对象。例子:

命令

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

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

普惠制

在您看来,您只需要一张表格。创建字段时,请使用以下索引:

<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) {
}

相关的SO问题。

于 2013-10-16T16:04:06.017 回答