Grails可以将POST变量作为数组处理吗?

时间:2014-11-03 17:06:01

标签: php grails post groovy httprequest

如果您将以下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中实现这一目标?

1 个答案:

答案 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)]]}