我继承了一个.NET 4.0应用程序,该应用程序使用一些带有调用Oracle过程的按钮的表单。通常,在按下这些按钮引起回发之前,RegisterStartupScript用于在执行后显示警报,因此在页面刷新之后。
现在,我想在用户按F5或刷新页面时禁用重新提交表单,我发现最直接的方法是使用Response.Redirect到同一页面而不是回发。所以,我尝试了以下内容:
Protected Sub btnButton_Click(sender As Object, e As System.EventArgs) Handles btnButton.Click
Try
' Do something (call Oracle procedure)
Dim TheScript As New StringBuilder
TheScript.Append("<script language=JavaScript>alert(""Success!"");</script>")
ClientScript.RegisterStartupScript(GetType(String), "ShowInfoPage", TheScript.ToString)
Catch ex As Exception
' Do something
End Try
Response.Redirect(Request.Url.ToString(), False)
End Sub
但页面重新加载后不会触发警报(显然)。
此时我有两个问题:
由于
答案 0 :(得分:1)
最简单的方法是使用QueryString
参数或Session
到&#34;存储&#34;该事件已被触发。
第一个代码段使用QueryString:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
If (Request.QueryString("status") = "success") Then
ScriptManager.RegisterStartupScript(Page, Page.GetType, "ShowInfoPage", "ShowInfoPage(1)", true)
End If
End Sub
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs)
Response.Redirect(Request.RawUrl.ToString() + "?status=success", false);
End Sub
如果您不希望QueryString参数可见,则可以使用Session:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
If (Not (Session("status")) Is Nothing) Then
If (Session("status").ToString = "success") Then
ScriptManager.RegisterStartupScript(Page, Page.GetType, "ShowInfoPage", "ShowInfoPage(2)", true)
Session.Remove("status")
End If
End If
End Sub
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs)
Session("status") = "success"
Response.Redirect(Request.RawUrl.ToString, false)
End Sub
我使用了this代码转换器,因此VB代码可能不是100%准确。
当用户按F5或默认刷新页面时,您无法阻止重新提交表单。这只是浏览互联网的固有行为。如果这仍然是一个问题,你应该考虑一下Ajax解决方案吗?