我已经创建了一个默认skelton的revel web应用程序。
我已经创建了一个新的路由/操作/视图:
控制器操作:
func (c Ctrl1) Action3() revel.Result {
variable1 := "test1"
variable2 := "test2"
c.Flash.Error("Message")
return c.Render(variable1,variable2)
}Action3.html:
{{set . "title" "Test"}}
{{template "header.html" .}}
{{template "flash.html" .}}
Hello: {{.variable1}}
{{template "footer.html" .}}当我第一次运行我的webapp时,我看到了一条flash消息。但是下一次,如果我刷新页面,它就消失了!
我重新启动了revel
谢谢
发布于 2019-01-27 00:34:10
我不熟悉revel,但是当你需要通过重定向进行一些用户通信时,通常会使用消息“闪烁”。godoc似乎也将其描述为完全适用于该用例。
如果您直接在此请求处理程序中呈现模板,则可能不应该使用c.Flash。我的猜测是,revel只会显示与请求一起收到的flash消息。调用c.Flash.Error设置cookie中的字段,这意味着它将被发送回调用者,而不是模板。在下一次呈现时,它将从调用者发送回服务器的cookie中读取,其中将包含此flash消息。显然,设置新的flash消息会替换旧的消息,导致它(再次)将其发送给调用者,而不是模板。
好消息是,只有一种方法可以让您的消息出现在页面上,而且几乎可以肯定地将您的消息硬塞到页面上:模板数据!使用通常的机制发送消息,而不是调用c.Flash.Error。在本例中,假设您的flash.html模板包含以下内容:
{{ if .flash.error }}
<div class="error">{{ .flash.error }}</div>
{{ end }}您应该能够通过将c.Flash.Error("Message")行替换为:
c.ViewArgs["flash"] = map[string]string{"error": "Message"}发布于 2019-01-27 01:15:05
这似乎是a known issue/expected behaviour。正如github上的讨论所暗示的那样,要使用flash消息来处理错误,您需要重定向:
c.Flash.Error("Message")
return c.Redirect("App/ShowError")或者,如果需要将错误消息添加到特定输入元素的旁边,则使用field template function。
由于您没有在模板中呈现表单,我猜您需要添加重定向。
顺便说一句:狂欢被许多人认为是有害的。我强烈建议您不要使用试图强迫您遵循经典MVC结构使用go的框架。如今,大多数web应用都是在客户端使用react的单页面应用,以及基于API的后端应用。沿着这条路走下去可能会让你的生活变得更容易?
https://stackoverflow.com/questions/54380070
复制相似问题