11

在我的 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无论我做什么,它都会一心一意通过模板渲染它。

跟进 2:关于 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

页面呈现为:Test App ajax call (hyperlink) Message = Hello Blank

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

Test App 
ajax call 
Message = Hello 
Test App 
ajax message 

请注意,模板正在“test1”中呈现,<p>这会导致第二个“Test App”。

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

4

4 回答 4

13

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

render text: "Name: ${person.name}", contentType: "text/plain"
于 2009-09-25T02:30:11.520 回答
3

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

于 2011-08-28T19:43:14.387 回答
3

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

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

于 2009-09-24T18:19:56.147 回答
0

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

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

于 2009-09-23T11:16:39.013 回答