2011-08-09 36 views
3

完整上下文:我正在嘗試使用grails應用程序處理多個文件。我將顯示的代碼來自後處理頁面,其中提供了有關所處理文件的信息。Grails在gsp中迭代訪問Map元素

我最初的感覺是用這樣的代碼:

<table> 
     <tr> 
     <th>Parsed from Excel:</th> 
     <th>Uploaded to DS:</th> 
     <th>File Name:</th> 
     <th>Size:</th> 
     </tr> 
     <tr> 
     <g:each in="${fileContents}" var="item"> 
      <td>${item}</td> 
     </g:each> 
     <%-- 
     <td>${fileContents.ExcelRows?.encodeAsHTML()}</td> 
     <td>${fileContents.policies?.encodeAsHTML()}</td> 
     <td>${fileContents.originalFileName?.encodeAsHTML()}</td> 
     <td>${fileContents.Size?.encodeAsHTML()}</td> 
     --%> 
     </tr> 
    </table> 

現在,我不明白的是爲什麼在<g:each循環顯示的內容始終報告key=value這樣ExcelRows=14我在一個已經收到輸出案例。

當我切換註釋時(注意正在使用<%--標記),它的工作原理與預期完全相同。從我的「ExcelRows」列中,我只得到「14」。我的想法有什麼問題,<g:each循環應該做同樣的事情?直覺上它歸結爲For each item in fileContents display item

我的控制器代碼:

def processFile = { 
     def uploadedFile = request.getFile('excelFile') 

//...snipped

 def fileContents = [ 
      ExcelRows:"${ods.numberOfRows}", 
      policies:"${ods.numberOfPolicies}", 
      originalFileName: "${ods.originalFilename}", 
      Size:"${ods.size}" 
      ] 

     [fileContents:fileContents] 
    } 
+0

ü可以發佈您的控制器代碼?即將模型'fileContents'返回到您的視圖? –

+0

@Arthur Neves添加了相關的控制器代碼 – avgvstvs

+1

所以,你的對象fileContents是一個Map而不是一個列表!所以這就是爲什麼顯示key =值 –

回答

8

當在地圖你會Entry s內工作的迭代。嘗試使用:

<g:each in="${fileContents}" var="item"> 
    <td>${item.value?.encodeAsHTML()}</td> 
</g:each> 

或者

<g:each in="${fileContents.values()}" var="item"> 
    <td>${item?.encodeAsHTML()}</td> 
</g:each> 
+0

你的第一個例子沒有打印任何東西,第二個失敗的'$ {fileContents.values()}'有一些我失蹤的東西? – avgvstvs

+0

你確定'fileContents'實際上是在視圖中設置的(非空)? –

+0

是的,我可以直接使用'​​$ {fileContents.ExcelRows?.encodeAsHTML()}' 直接訪問元素所以我知道它的存在。 – avgvstvs