2014-01-14 3 views
2

내 GSP에 컨트롤러에서 제공된지도로 채워진 많은 텍스트 필드가있는 양식이 있는데 실제 양식이 이보다 훨씬 복잡하기 때문에 이것을 예로 들어 보겠습니다. :제출 된 양식 텍스트 필드가 올바르게 그룹화되지 않았습니다.

예를 들어

, 나는 각 사람의 age, 나는 data라는 맵에 그들을 그룹화 입력 할 수있는 텍스트 필드의 무리를 채우는 데 users를 사용하고, 내가 제출 한 후 모든 정보를 처리하고 저장하려면 :

<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를 인쇄 할 때 85,컨트롤러, 나는 눈치 그뿐만 아니라 내가 만든 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

확장 된 형태와 확장되지 않은 형태 모두에서 데이터'지도 '가 생성 된 것 같습니다. 처리해야 할 것 같습니다. 'for' 루프 안에'if (i.value instanceof Map)'와 같은 것을 추가해보십시오. – nickdos

답변

1

정확히 이런 식으로 작동합니다. 단지처럼

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를 구문 분석 할 수 : 당신이 양식에서 데이터를 제출 할 때, 당신의 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의 개발자는 프로그래머의 삶을 단순화하고 싶어, 그들은 키가 점을 포함하는 경우, 요청이 구조화 된 데이터의 어떤 종류를 나타낼 수 있다는 것을 결정했다. 그래서 그들은 원시 요청 데이터 외에도이를 맵에 넣기로 결정했습니다. 따라서 도트는 두 가지 방법으로 해석 할 수 있습니다. 즉, 일반 기호 또는 맵 이름과 맵 키 사이의 구분 기호로 해석 할 수 있습니다. 그리고 개발자가 어떤 점에서 점을 해석해야하는지는 개발자의 몫입니다.

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}" 
    } 
} 
관련 문제