我有一个表单,用户可以在其中输入同一个域类的许多记录。这些记录中的每一个都应在提交后进行验证。如果验证成功,则应将记录集合传递到另一个视图,否则验证错误应显示在同一视图中,同时保留先前输入的值。应使用专用命令对象进行验证。
为了拍出更好的照片,形式大致如下:
我想出了一个解决方案,将每个记录映射到一个表单(从呈现视图的初始操作返回项目列表):
<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>
但我不确定这种方法的正确性。
实施此方案时,我面临的挑战很少:
提前致谢。
答案 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)
}
在您的视图中,您只需要一个表单。创建字段时,请使用索引,如:
<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) {
}