每个人都知道通过html表单将参数传递给控制器:
<g:form action="save">
<g:textField name="text1" />
</g:form>
我隐约知道能够将这些参数构建为Grails中的某种对象表示法:
<g:form action="save">
<g:textField name="text.a" />
<g:textField name="text.b" />
</g:form>
很少知道它们在控制器中是如何构造的(对象?hashmaps?我记得在某些时候使用.value使用后一个例子)。
所以我想这个问题实际上是两个问题:
Grails如何处理对象表示法中的参数,如第二个示例?你也可以把它们插入阵列吗?
关于表单提交及其参数的哪些其他技巧可以使表单中包含非常复杂和迭代的数据在控制器中处理?例如,ATG允许您将表单字段绑定到bean,遍历其整个属性图以查找您需要设置的属性。
答案 0 :(得分:0)
第二种表示法"text.a"
用于消除从属性到域对象的数据转换的歧义。例如,如果您有2个域对象,每个域对象都有一个属性"a"
,那么如果您执行domObj1.properties = params
和domObj2.properties = params
,则该值将转到两个域对象,这可能与您不同。因此,在您的视图中,您应该有变量domObj1.a和domObj2.a,并且在您的grails控制器中,您可以使用def domObj1 = new DomObj1(params["domObj1"])
实例化
根据你的第二个问题,如果你的意思是你是否可以迭代对象,你可以在$ {}包装器中使用GPath语法,例如检查下面id属性中的代码。
<td><g:remoteLink controller="device" action="getDevice" id="${objInstance.prop1.prop2.id}" update="propDetail">${fieldValue(bean: objInstance.prop1, field: "prop1")}</g:remoteLink></td>
上面的示例还显示了grails gsp的表单提交的ajax方式。