所以我读了一个名为PRG的方法作为解决表单双提交问题的方法。但是,我还没有找到向用户显示的摘要页面/成功消息的下降实现。我能想到的唯一方法是存储会话变量,但我不希望它在多次刷新时持续存在。它应该显示消息/摘要一次,然后完成。此外,如果用户无法返回先前提交的页面,那将是理想的。
这是我的PRG代码:
Protected Sub InsertRequest() Handles wizard.FinishButtonClick
Using connection As New SqlConnection(connectionStr)
Dim insertQuery As New SqlCommand("spInsertRequest", connection)
insertQuery.CommandType = CommandType.StoredProcedure
'1 - SETUP SQL PARAMETERS (omitted for brevity)
'2 - POST (inserts record into DB)
Try
connection.Open()
insertQuery.ExecuteNonQuery()
connection.Close()
Catch ex As Exception
Logger.WriteToErrorLog(Me, ex.Source, ex.Message, ex.StackTrace)
End Try
'3 - REDIRECT (to the same page and...)
Try
Dim urlRedirect As String = If(IsNothing(Request.Url), "", IO.Path.GetFileName(Request.Url.AbsolutePath)) 'Gets the filename of the current page.
If Not String.IsNullOrEmpty(urlRedirect) Then
Session.Add("referrerPage", urlRedirect) 'Used for identifying when the page is being redirected back to itself.
PageExt.AddParam(urlRedirect, "id", recID.ToString)
Response.Redirect(urlRedirect)
End If
Catch ex As Exception
Logger.WriteToErrorLog(Me, ex.Source, ex.Message, ex.StackTrace)
End Try
End Sub
'4 - GET (Display 'Success' message/summary here)
问题是,如何在直接由提交产生的重定向上显示此消息,并且最好不再进行任何更新?或者只是简单地显示消息而不管刷新,无论什么是最简单的并且最有意义。谢谢;)
答案 0 :(得分:2)
让这样的消息只显示一次的技巧是使用“flash”会话数据的概念。
这通常的工作方式是在重定向之前在会话中存储“消息”(或与您需要的“成功”相关的任何其他数据)。然后,在处理重定向时,请确保在发送“成功页面”响应之前从会话中删除闪存数据。
这样,如果用户尝试返回成功页面,则闪存数据将不会在要拾取的会话中,因此您不会将其显示两次。为了对用户友好,您可以检查闪存数据是否丢失,如果他们试图进入Post-Redirect-Get流程之外的成功页面,则会显示一条很好的错误消息。
这正是Grails框架(在Groovy世界中)的作用,并且它运行良好。