Grails 提交的表单文本字段分组不正确

Grails 提交的表单文本字段分组不正确,grails,gsp,Grails,Gsp,在我的GSP中,我有一个表单,其中有许多文本字段,由来自控制器的映射填充,让我把它放在一个示例中,因为我的实际表单比这个复杂得多: 例如,如果我使用用户填充一组文本字段,在这些字段中我可以输入每个人的年龄,我会将它们分组到一个名为数据的地图中,我希望在提交后处理并保存所有这些信息: <g:form useToken="true" name='example_form' action='submit'> <g:each in='${users}' var='user' s

在我的GSP中,我有一个表单,其中有许多文本字段,由来自控制器的映射填充,让我把它放在一个示例中,因为我的实际表单比这个复杂得多:

例如,如果我使用
用户
填充一组文本字段,在这些字段中我可以输入每个人的
年龄
,我会将它们分组到一个名为
数据
的地图中,我希望在提交后处理并保存所有这些信息:

<g:form useToken="true" name='example_form' action='submit'>
    <g:each in='${users}' var='user' status='i'>
        <g:textField name="data.${user.id}.name" value="${i.name}">
        <g:field name="data.${user.id}.age" value=""> 
    </g:each>
    <button>Submit</button>
</g:form>
输出:

key: 0.name    value: john
key: 0    value: [age: 35, name: john]
key: 1.name    value: liz
key: 1    value: [age: 24, name: liz]
key: 2.name    value: robert
key: 3.name    value: david
key: 0.age    value: 35
key: 1.age    value: 24
key: 2    value: [age: 44, name: robert]
key: 3    value: [age: 23, name: david]
key: 3.age    value: 23
key: 2.age    value: 44
我做错什么了吗

预期产出:

key: 0    value: [age: 35, name: john]
key: 1    value: [age: 24, name: liz]
key: 2    value: [age: 44, name: robert]
key: 3    value: [age: 23, name: david]

它应该就是这样工作的。从表单提交数据时,POST请求的正文如下所示:

data.0.name=john&data.0.age=35&data.1.name=liz&data.1.age=24&data.2.name=robert&data.2.age=44&data.3.name=david&data.3.age=23
所以,它只是一个普通字符串,表示一个普通的键值映射,Grails可以解析如下:

['data.0.name': 'john', 'data.0.age': '35', 'data.1.name': 'liz', 'data.1.age': '24', 'data.2.name': 'robert', 'data.2.age': '44', 'data.3.name': 'david', 'data.3.age': '23']

但是Grails开发人员希望简化程序员的生活,他们决定,如果密钥包含一个点,那么请求可能代表某种结构化数据。所以他们决定把它放到地图上,除了原始的请求数据。因此,点可以用两种方式解释-作为普通符号,或作为地图名称和地图键之间的分隔符。这取决于开发人员对点的解释方式。

如果您更喜欢使用更清晰的参数,而不是易于使用的参数,如
def name=params.data.0.name
,那么您可以使用“u”代替“.”。在控制器中,您可以在循环中使用
split(“”)

在之前的帖子中@Alexander Tokarev解释了发生的事情。解决方案是一个if语句,如下所示:

for(i in params.data){
    if( i.key.isNumber() ) {
        println "key: ${i.key}    value: ${i.value}"
    }
}

看起来您正在以展开和未展开的形式获取数据
Map
。。。我想你得处理这件事。尝试在
for
循环中添加一个检查,类似于
if(i.value instanceof Map)
for(i in params.data){
    if( i.key.isNumber() ) {
        println "key: ${i.key}    value: ${i.value}"
    }
}