Grails“render”呈现模板

时间:2009-09-23 09:29:10

标签: grails gsp

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

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

问题是render呈现整个模板。因此,它不是仅渲染“Name:John”,而是呈现模板中定义的所有图标,导航等。如何在没有模板的情况下让render进行渲染?

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

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

def ajaxRandomPersonName = {
    def person = get a random person ...
    render (template:null, text:"Name: ${person.name}")
}
无论我做什么,

render都会全心全意地通过模板呈现它。

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

跟进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调用(超链接) 消息=你好 空白

“Test App”来自模板。当我单击“ajax call”时,它会对PersonController的ajaxTest方法进行异步调用(使用println验证)。所有ajaxTest都是println并呈现静态文本。结果如下:

Test App 
ajax call 
Message = Hello 
Test App 
ajax message 

请注意,模板正在“test1”<p>中呈现,这导致第二个“测试应用”。

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

4 个答案:

答案 0 :(得分:13)

已解决:添加contentType会导致模板未呈现:

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

答案 1 :(得分:3)

让您的客户端javascript代码处理JSON响应并使用以下内容呈现您的响应:

  

渲染[text:“名称:$ {person.name}”]为   JSON

答案 2 :(得分:2)

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

答案 3 :(得分:0)

我们发现从操作中显式返回false会修复此问题。

我相信做渲染foo,因为JSON隐式返回false。