如果您将以下HTML发布到PHP脚本中:
<input type="hidden" name="var[0]" value="A" />
<input type="hidden" name="var[2]" value="C" />
<input type="hidden" name="var[1]" value="B" />
您最终会得到一个名为$_POST['var']
的变量(实际上是一个HashMap),其键/值如下所示:
[0] => "A"
[1] => "B"
[2] => "C"
在PHP中,我可以对此进行基本的数组逻辑,例如我可以看到count($_POST['var']) == 3
,我可以用foreach
语句迭代它。
有没有办法在Grails中实现这个或类似的东西?我注意到如果我将相同类型的HTML传递给Grails,结果远不如PHP那么直观。我想要做的只是能够访问params.var[0]
,params.var[1]
等等,同样能够检查params.var.length
等内容。< / p>
但事实并非如此。 发生的原因是params.var
未定义,但我必须访问request.getParameter('var[0]')
,这显然是无用的。
我意识到我可以将HTML更改为以下内容:
<input type="hidden" name="var" value="A" />
<input type="hidden" name="var" value="B" />
<input type="hidden" name="var" value="C" />
但这远非理想,因为我必须保证HTML输入每次都是正确的顺序。在PHP中,它们出现在哪个顺序并不重要,因为我可以直接在name属性中指定它,并且语言足够聪明以便处理它。
我错过了什么吗?有没有办法在Grails中实现这一目标?
答案 0 :(得分:0)
实际上,绑定数据时默认情况下会这样做。请参阅http://grails.org/doc/latest/guide/theWebLayer.html#dataBinding 绑定到收藏集和地图。
数据绑定器可以填充和更新集合和地图。以下代码显示了填充域类中对象List的简单示例:
class Band { String name static hasMany = [albums: Album] List albums } class Album { String title Integer numberOfTracks } def bindingMap = [name: 'Genesis', 'albums[0]': [title: 'Foxtrot', numberOfTracks: 6], 'albums[1]': [title: 'Nursery Cryme', numberOfTracks: 7]] def band = new Band(bindingMap) assert band.name == 'Genesis' assert band.albums.size() == 2 assert band.albums[0].title == 'Foxtrot' assert band.albums[0].numberOfTracks == 6 // ...
此外,如果你想自己处理这个问题,你当然可以自己写。 E.g:
params.collect{it=~/${name}\[(\d+)\]/}.findAll().collectEntries{[it.group(1).toInteger(), params[it.group(0)]]}