javascript - VB.NET - 注册启动脚本然后重定向到同一页面

标签 javascript asp.net vb.net

我继承了一个 .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

但是在页面重新加载后警报(显然)没有被触发。

此时我有两个问题:

  1. 有没有一种快速的方法来确保重定向不会丢失用 RegisterStartupScript 记录的脚本?对于“快速”,我的意思是例如“使用传输而不是重定向”或不涉及重写警报管理代码的东西;
  2. 为了不在代码的每个部分添加 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/

相关文章:

JavaScript:将主 div 标签高度设置为零,这使得所有子 div 的高度都为零

javascript - grails g :select item as optionValue

asp.net - 在 MVC 3 应用程序内运行时编译(生成 dll)

vb.net - InvalidCastException 与 WebBrowser.IsBusy 或 ReadyState (VB .NET)

javascript - 如何协调 BackboneJs View 并在它们之间传递对象?

javascript - 如何停止 Razors 自动编码\n?

asp.net - 从 convert.tostring() 转换空值

Javascript 禁用作为 asp.net 控件加载的元素的内联 onclick

vb.net - 图片框数组(我做得对吗?)

sql-server - 保存记录时出现 MS Access ODBC 超时错误