如何在Grails表单中获取几个相同的对象值

时间:2013-05-06 14:03:27

标签: forms grails grails-plugin

让我们来一个simpe域类:

class Person { String aname }

让用户输入一个人的gsp表单很简单:

<g:form ...>
...
  someone:<input name="aname">
...
</g:form>

...然后返回控制器,获取值,我可以写

def p = new Person(params)

现在,我想让用户以相同的形式输入两个人(比方说,两个父母)的数据。怎么写这个?我只是不能给两个输入字段指定相同的名称,但是如果我不保留原始属性名称(“aname”),那么在控制器中我将不得不手工处理名称之间的绑定。 property和表单输入名称:

<g:form ...>
...
  father:<input name="aname1">
  mother:<input name="aname2">
...
</g:form>

然后,在控制器中

def p1 = new Person(); p1.aname = params.aname1
def p2 = new Person(); p2.aname = params.aname2

即使表单中有多个相同类型的对象,有没有办法保留自动绑定功能?

3 个答案:

答案 0 :(得分:1)

尝试使用这种方式:

<g:form ...>
...
  father:<input name="father.aname">
  mother:<input name="mother.aname">
...
</g:form>

和控制器:

def p1 = new Person(params.father); 
def p2 = new Person(params.mother); 

答案 1 :(得分:0)

我想你正在考虑做这样的事情:

<g:form ...>
...
  father:<input name="aname">
  mother:<input name="aname">
...
</g:form>

将导致?aname=Dad&aname=Mom

您可以在控制器中处理它们,如下所示:

params.list('aname').each{eachName -> //Persist each `aname`}

查看Handling Multi Parameters

答案 2 :(得分:0)

“name”属性中的点表示法适用于<input>标记。

为了更进一步,还有“fields”插件的解决方案:不应使用“name”属性,而应使用“prefix”作为described here

例如:

<f:field bean="mother" property="forename" prefix="mother."/>
<f:field bean="mother" property="surname"  prefix="mother."/>
<f:field bean="father" property="forename" prefix="father."/>
<f:field bean="father" property="surname"  prefix="father."/>

我们甚至可以在<f:with>标记的帮助下更好地编写它:

<f:with bean="mother"  prefix="mother.">
   <f:field property="forename"/>
   <f:field property="surname"/>
</f:with>
<f:with bean="father"  prefix="father.">
   <f:field property="forename"/>
   <f:field property="surname"/>
</f:with>