【问题标题】:Grails "render" renders the templateGrails“渲染”渲染模板
【发布时间】:2010-11-30 16:46:06
【问题描述】:

在我的 Grails 控制器中,我正在响应 AJAX 调用并使用 render 返回文本:

def ajaxRandomPersonName = {
    def person = get a random person ...
    render "Name: ${person.name}"
}

问题是render 渲染了整个模板。因此,它不仅呈现“姓名:约翰”,还呈现模板中定义的所有图标、导航等。如何让render 在没有模板的情况下只渲染?

我非常关注使用 Grails 1.1.1 的“Grails in Action”(第 28 页)的第 1 章。

跟进: 根据 Rhysyngsun 的建议返回 false 没有任何影响。我也尝试将模板设置为 null,但它仍然呈现模板:

def ajaxRandomPersonName = {
    def person = get a random person ...
    render (template:null, text:"Name: ${person.name}")
}

render 不管我做什么都会一心一意地通过模板渲染它。

跟进 2Parallel discussion 在 grails-user 邮件列表中。

跟进3:示例代码: 我将我的代码配对到最低限度,但它仍然表现出不希望的模板渲染。

控制器/PersonController.groovy:

class PersonController { 
    def index = { } 
    def home = { [message:"Hello"] } 

    def ajaxTest = { 
        println "ajaxTest called" 
        render text: "ajax message" 
    } 
} 

views/person/home.gsp(主页方法的查看页面)

<html> 
<head> 
    <title>Home View</title> 
    <g:javascript library="prototype" /> 
</head> 
<body> 
    <p> 
        <g:remoteLink action="ajaxTest" update="test1">ajax call</g:remoteLink> 
    </p> 
    <p>Message = ${message}</p> 
    <p id="test1">Blank</p> 
</body> 
</html> 

views/layouts/person.gsp(人物控制器的布局模板)

<html> 
<head> 
    <title>Test App - <g:layoutTitle/></title> 
    <g:layoutHead/> 
</head> 
<body> 
    <h1>Test App</h1> 
    <g:layoutBody/> 
</body> 
</html> 

我使用主视图访问人员控制器: http://localhost:8080/test/person/home

页面呈现为: 测试应用 ajax 调用(超链接) 消息 = 你好 空白

“测试应用”来自模板。当我单击“ajax 调用”时,它会异步调用 PersonController 的 ajaxTest 方法(使用 println 验证)。 ajaxTest 所做的只是 println 并呈现静态文本。结果如下:

Test App 
ajax call 
Message = Hello 
Test App 
ajax message 

请注意,模板正在“test1”&lt;p&gt; 中呈现,这会产生第二个“Test App”。

我正在运行 Grails 1.1.1。有任何想法吗?代码看起来很简单。我下载了 Grails 源代码并查看了 RenderDynamicMethod.java。除非模板在参数列表中,否则它不会进行任何模板渲染,但它不是。所以我唯一的猜测是再次渲染模板。

【问题讨论】:

    标签: grails gsp


    【解决方案1】:

    您可能会被 Grails 中的“按惯例布局”功能所困扰。例如,如果您的布局名称与控制器名称前缀匹配,Grails 会将布局应用于该控制器管理的每个视图。不幸的是,它甚至适用于文本和模板。目前有一些关于此的 JIRA 记录(例如,参见 http://jira.grails.org/browse/GRAILS-7624)。 我今天被这个烫伤了。我通过简单地重命名我的布局 gsp 使其与任何控制器名称不匹配来解决它。我的布局最初命名为“storefront.gsp”,并且我有一个名为 StorefrontController 的控制器。我将布局重命名为“public.gsp”。

    【讨论】:

      【解决方案2】:

      已解决:添加 contentType 导致模板不被渲染:

      render text: "Name: ${person.name}", contentType: "text/plain"
      

      【讨论】:

      • 是的,请详细说明您在何处找到此答案。顺便说一句,本应花 30 分钟完成的第 1 章却花了我几个小时才完成,这真是太可惜了。而且,我对 Grails 的第一次尝试感到非常失望
      【解决方案3】:

      让您的客户端 JavaScript 代码处理 JSON 响应并呈现您的响应:

      将 [text:"Name: ${person.name}"] 渲染为 JSON

      【讨论】:

        【解决方案4】:

        我们发现从操作中显式返回 false 可以解决此问题。

        我相信将 foo 渲染为 JSON 会隐式返回 false。

        【讨论】:

        • 我只是尝试在渲染后返回 false,它仍然会渲染模板。