在我的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。除非模板位于参数列表中,否则它不会执行任何模板渲染。所以我唯一的猜测是蒸汽再次渲染模板。
答案 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。