让我们来一个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
即使表单中有多个相同类型的对象,有没有办法保留自动绑定功能?
答案 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`}
答案 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>