【问题标题】:Grails iterating in gsp vs. accessing Map elementsGrails 在 gsp 中迭代与访问 Map 元素
【发布时间】:2011-08-09 12:15:28
【问题描述】:

完整上下文:我正在尝试使用 grails 应用程序处理多个文件。我将显示的代码来自后处理页面,其中提供了有关已处理文件的信息。

我最初的感觉是使用这样的代码:

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

现在,我不明白为什么&lt;g:each 循环中显示的内容总是报告key=value,例如我在一个输出案例中收到的ExcelRows=14

当我切换 cmets(注意正在使用的 &lt;%-- 标记)时,它的工作方式完全符合预期。从我的“ExcelRows”列中,我只得到“14”。我认为&lt;g:each 循环应该做同样的事情有什么问题?直觉上它归结为For each item in fileContents display item

我的控制器代码:

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

//...剪掉了

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

        [fileContents:fileContents]
    }

【问题讨论】:

  • 你能发布你的控制器代码吗?将模型“fileContents”返回到您的视图?!
  • @Arthur Neves 添加了相关控制器代码
  • 所以,您的目标文件内容是地图而不是列表!所以这就是为什么显示 key=value
  • @Arthur,我应该如何在不嵌入 groovy/Java 代码的 gsp-land 中迭代地图?
  • Rob Hruska 的第二个建议怎么样? ${item?.encodeAsHTML()}

标签: grails gsp


【解决方案1】:

迭代地图时,您将使用Entrys。尝试使用:

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

【讨论】:

  • 您的第一个示例没有打印任何内容,第二个示例在${fileContents.values()} 上失败了,我缺​​少什么吗?
  • 您确定 fileContents 确实在视图中设置(为非空值)吗?
  • 是的,我可以使用&lt;td&gt;${fileContents.ExcelRows?.encodeAsHTML()}&lt;/td&gt; 直接访问元素,所以我知道它在那里。
  • 这很奇怪。如果在我的第一个示例中,将${fileContents} 替换为${fileContents.entrySet()},会发生什么?
  • fileContents 必须为空。
猜你喜欢
  • 2011-09-20
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多