2015-10-14 64 views
0

我使用Grails 2.3.7並希望瞭解以下內容:我有一個控制器,它使用來自i18n文件的HTML標記設置flash.message對象(messages.properties)和沒有HTML標記的參數。 當我調用渲染時,相應的GSP按預期呈現,並帶有HTML標記。當我將重定向調用到另一個動作時,它執行完全相同的操作(調用render),呈現的GSP顯示轉義的HTML標記。 那麼在重定向期間flash變量會發生什麼?一個簡單的println顯示沒有區別。作爲參考,這裏是我的代碼:Grails 2.3.7使用flash.message,i18n和html標記重定向控制器動作

控制器:

class DebugController { 

    def testFlashEncoding(){ 
     flash.message=message(code: "debug.flash.test", args: ["inner text with no markup"]) //debug.flash.test=<div style="border:1px solid red;">{0}</div> 
     flash.each { 
      println("flash in testFlashEncoding(): " + it) 
     } 
//  redirect(action: "index") //redirects to index(), html is rendered as text 
     render view: "testFlashEncoding" //renders testFlashEncoding.gsp, html is interpreted 
    } 

    def index(){ 
     flash.each { 
      println("flash in index(): " + it) 
     } 
     render view: "testFlashEncoding" //renders testFlashEncoding.gsp, html is rendered as text 

    } 
} 

GSP:

<!DOCTYPE html> 
<html> 
<head> 
    <meta name="layout" content="main"> 
    <title>DEBUG</title> 
</head> 

<body> 
<g:if test="${flash.message}"> 
    <div class="alert alert-success" role="status">${flash.message}</div> 
</g:if> 
<g:if test="${flash.error}"> 
    <div class="alert alert-danger" role="status">${flash.error}</div> 
</g:if> 
</body> 
</html> 

所以,當我打電話testFlashEncoding()動作,如上圖所示,在GSP顯示大約有紅色邊框簡單的文字。但是,當我使用重定向到index()操作時,GSP顯示爲<div style="border:1px solid red;">inner text with no markup</div>。 的println語句顯示預期值:

flash in testFlashEncoding(): message=<div style="border:1px solid red;">inner text with no markup</div>

flash in index(): message=<div style="border:1px solid red;">inner text with no markup</div>

因此閃存的內容不感動,但不知何故,在重定向的Grails有一些類型的交換機,它告訴渲染引擎逃生flash.message對象。

爲了說明問題,我使用了一個新設置的標準grails應用程序,所以我的頁面編解碼器設置爲grails.views.default.codec = "html",我確實知道改變頁面編解碼器或強制原始渲染的可能性,我只想知道在重定向(這種情況在我當前的項目中經常發生)。

+0

請閱讀https://grails.github.io/grails-doc/latest/ref/Controllers/flash.html? –

+0

是的,並根據文檔閃存變量的內容被保存,直到下一個請求的結束,這正是我想要的和期望的。變量的內容沒有改變,但是渲染引擎的行爲。 – Calon

回答

0

嘗試的兩者之一:爲我工作

${raw(flash.message)} 

<%= flash.message %> 

。它打印了正確的標記HTML

+0

正如我在我的問題中寫的,我知道可能會強制編碼像你所建議的那樣,但這不是我正在尋找的,我正在尋找直接調用渲染時不起作用的原因,但不起作用當調用重定向。 – Calon

相關問題