2014-01-14 22 views
2

在我的GSP中,我有一個表單,裏面填充了很多來自控制器的地圖的textfields,讓我把它放在一個例子中,因爲我的實際表單比這個複雜得多:提交表單文本字段不正確分組

例如,如果我用users填充一堆文本框,我可以進入每個人的age,我組合起來到一個名爲data地圖,我想提交後處理並保存所有的信息:

<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> 

但是,當我打印出params.data在我的submit控制器,我發現不僅我得到我所創建的data地圖,我也越來越在它多了一堆垃圾:

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

輸出:

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] 
+0

看起來您正在以擴展和未擴展的形式獲取數據'Map' ......我認爲您必須處理它。嘗試在'for'循環內添加一個檢查,如'if(i.value instanceof Map)'。 – nickdos

回答

1

它應該工作正是這樣。當你從你的表單提交數據,您的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開發希望簡化程序員的生活,他們決定,如果該鍵包含一個點,該請求可能代表某種結構化數據。所以他們決定把它放到地圖上,除了原始的請求數據。因此,可以用兩種方式解釋點 - 作爲普通符號,或作爲地圖名稱和地圖鍵之間的分隔符。開發者應該以何種方式解釋點。

0

如果您更喜歡使用像def name = params.data.0.name這樣的簡單易用的參數,那麼您可以使用「_」來代替「。」。在控制器中,您可以在循環中使用split("_")

0

在上一篇文章中@Alexander Tokarev解釋了發生了什麼事。解決方案是if語句,如下所示:

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