Grails 防止Flash消息显示两次(在出现错误的页面和下一页)

Grails 防止Flash消息显示两次(在出现错误的页面和下一页),grails,groovy,request,Grails,Groovy,Request,如果表单my grails应用程序中存在错误,则会产生一条flash消息。如果我转到另一个页面,新页面上会再次显示(旧)flash消息。 如何防止这种情况发生?一种想法是,当检测到错误时,清除第一页上的flash消息。尝试使用request.message,它的作用与flash.message相同,但只会持续足够长的时间,以显示一次 控制器: request.message = message; flash.specificKeyForControllerAndAction = "Some m

如果表单my grails应用程序中存在错误,则会产生一条flash消息。如果我转到另一个页面,新页面上会再次显示(旧)flash消息。
如何防止这种情况发生?

一种想法是,当检测到错误时,清除第一页上的flash消息。

尝试使用request.message,它的作用与flash.message相同,但只会持续足够长的时间,以显示一次

控制器:

request.message = message;
flash.specificKeyForControllerAndAction = "Some message"
在gps上,您可以像使用flash一样使用它。消息:

<g:if test="${request.message }"><br>
  <div class="message">${request.message}</div> </g:if>

${request.message}
我不确定request.message路由在较新版本的grails中是否仍然是一个选项,因为我尝试了这个方法,但它对我不起作用

我发现一种避免两次显示消息的方法是在flash中使用更具体的键设置消息,例如:

控制器:

request.message = message;
flash.specificKeyForControllerAndAction = "Some message"
普惠制:


${flash.specificKeyForControllerAndAction}

显然,该键可以是您想要的任何键,但请确保您的其他视图没有检查相同的键,否则消息将再次显示。

如果消息仅用于请求,请使用request.message。如果可能涉及重定向,请使用flash,然后在gsp中显示flash消息后清除该消息:

<div class="message">
    ${flash?.message}
</div>

<%
// Prevent flash messages displaying twice if there is no redirect
flash.message = null
%>

${flash?.message}

我将把所有这些都放在一个标准模板中,您可以使用它来显示消息。

引用grails文档

flash对象是一个映射(散列),可用于存储键值对。这些值透明地存储在会话中,然后在下一个请求结束时清除

此模式允许您使用HTTP重定向(这对于post后重定向很有用)并保留可以从flash对象检索的值

你必须记住重定向是如何工作的

当您执行重定向时,会返回到客户端浏览器,浏览器会调用它接收到的url,然后此调用是添加flash消息后的“下一个”请求

然后,您应该在重定向之前添加一条flash消息。因为在下一个请求结束时会清除此闪存消息。或者,如果您不使用重定向,只需执行简单的转发(例如,gsp的简单返回呈现),则在添加flash消息后不会有其他请求。因此,下一个请求将在您访问另一个链接时发出。 只有在下一个请求结束时,在gsp呈现之后,grails框架才会从会话中清除flash消息

总结如下:

  • 如果要在执行重定向时显示消息,请使用flash消息。它由框架自动清除
  • 如果要在转发时显示消息,可以使用fonger所述的解决方案(在请求中添加消息)

这个问题把我烦透了,不错!