我继承了一个 .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
但是在页面重新加载后警报(显然)没有被触发。
此时我有两个问题:
- 有没有一种快速的方法来确保重定向不会丢失用 RegisterStartupScript 记录的脚本?对于“快速”,我的意思是例如“使用传输而不是重定向”或不涉及重写警报管理代码的东西;
- 为了不在代码的每个部分添加 Response.Redirect,我如何拦截任何回发请求,以便将其替换为重定向到请求回发的同一页面?我想到了像 HttpModule 之类的东西,虽然我在这方面没有太多经验(如果我说了一些无意义的东西,对不起)。
谢谢
最佳答案
最简单的方法是使用 QueryString
参数或 Session
来“存储”事件已被触发。
第一个片段使用 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 解决方案?
关于javascript - VB.NET - 注册启动脚本然后重定向到同一页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40157314/