我用默认的kelton创建了一个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时,看到了闪断消息。 但是下一次,如果我刷新页面,它就会消失!
我已经重新开始狂欢
谢谢
答案 0 :(得分:0)
我对revel
不熟悉,但是当您需要一些用户通信来通过重定向进行传递时,通常会使用消息“闪烁”。 godoc似乎也针对该用例进行了准确的描述。
如果直接在此请求处理程序中呈现模板,则可能不应该使用c.Flash
。我对发生的情况的猜测是,revel
仅会在请求中显示Flash消息 received 。调用c.Flash.Error
会设置cookie中的字段,这意味着它将被发送回调用方,而不是模板。在 next 呈现器上,它将从调用者发送回服务器的cookie中读取信息,其中将包含此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"}
答案 1 :(得分:0)
这似乎是a known issue/expected behaviour。正如github上的讨论所暗示的那样,要使用Flash消息进行错误处理,您要么需要重定向:
c.Flash.Error("Message")
return c.Redirect("App/ShowError")
或者如果您需要在特定输入元素旁边添加错误消息,请使用field
template function。
由于您未在模板中呈现表单,因此我猜想您需要添加重定向。
偶然地:许多人认为陶醉是有害的。我敦促您不要使用试图强迫您遵循经典MVC结构的go框架。如今,大多数Web应用程序都是在客户端使用React和基于API的后端的单页应用程序。也可能使您的生活更容易走这条路?