我使用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"
,我確實知道改變頁面編解碼器或強制原始渲染的可能性,我只想知道在重定向(這種情況在我當前的項目中經常發生)。
請閱讀https://grails.github.io/grails-doc/latest/ref/Controllers/flash.html? –
是的,並根據文檔閃存變量的內容被保存,直到下一個請求的結束,這正是我想要的和期望的。變量的內容沒有改變,但是渲染引擎的行爲。 – Calon