2009-09-23 266 views
10

在我的Grails控制器我響應AJAX調用和使用render返回文本:Grails的「渲染」渲染模板

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

的問題是,render使得整個模板。因此,不是僅呈現「名稱:約翰」,而是呈現模板中定義的所有圖標,導航等。我如何才能讓render僅使用模板進行渲染?

我非常喜歡使用Grails 1.1.1的「Grails in Action」(第28頁)第1章。

跟進: 根據Rhysyngsun的建議返回錯誤沒有影響。我也試過設置模板爲空,但它仍然呈現模板:

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

render有心臟一心使其通過模板,無論我做什麼。

後續2Parallel discussion關於grails-user郵件列表。

跟進3:示例代碼: 我配對了我的最低代碼,它仍然表現出不想要的模板呈現。

控制器/ PersonController.groovy:

​​

的意見/人/ 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> 

的意見/佈局/ 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調用鏈接(hyperlink) 消息=你好 空白

「測試應用程序」 是從模板。當我點擊「ajax call」時,它會對PersonController的ajaxTest方法(使用println進行驗證)進行異步調用。所有ajaxTest都是println並呈現靜態文本。這個結果在下面:

Test App 
ajax call 
Message = Hello 
Test App 
ajax message 

注意模板被「測試1」 <p>導致第二個「測試應用程序」中呈現。

我正在運行Grails 1.1.1。有任何想法嗎?代碼看起來很直接。我下載了Grails源代碼並查看了RenderDynamicMethod.java。它不會進行任何模板渲染,除非模板在參數列表中,否則不會。所以我唯一的猜測就是蒸汽正在渲染模板。

回答

13

解決:添加的contentType會導致無法呈現模板:

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

你是怎麼知道這件事的? – 2010-01-14 20:59:30

+4

是的,請詳細說明您在哪裏找到答案。另一方面,第1章本應花費我30分鐘,花了我數小時才完成,這真是令人遺憾。而且,我對第一次刺傷Grails感到非常失望 – 2011-09-17 15:56:19

0

我們發現顯式地從動作返回false修復了這個問題。

我相信做渲染foo作爲JSON隱式返回false。

+0

我只是嘗試渲染後返回false,它仍然呈現模板。 – 2009-09-23 15:58:05

3

讓您的客戶端的JavaScript代碼處理JSON響應,並呈現與您的迴應:

渲染[文: 「姓名:$ {} person.name」]作爲 JSON

2

你可能會得到由「佈局按約定」功能燒燬在Grails中。例如,如果您的佈局名稱與控制器名稱前綴匹配,則Grails會將佈局應用於該控制器管理的每個視圖。不幸的是,它甚至適用於文本和模板。目前有幾個JIRA記錄在案(例如見http://jira.grails.org/browse/GRAILS-7624)。 今天我被燒了。我解決了它,只需重命名我的佈局gsp,使其不匹配任何控制器名稱。我的佈局最初名爲'storefront.gsp',我有一個名爲StorefrontController的控制器。我將佈局重命名爲'public.gsp'。