【问题标题】:Response.Redirect(Request.Url.AbsoluteURI) Clearing all user entriesResponse.Redirect(Request.Url.AbsoluteURI) 清除所有用户条目
【发布时间】:2017-07-25 10:18:39
【问题描述】:

我有一个页面,用户在其中填写一些文本框,这些文本框使用提交按钮保存到 SQL 数据库。该页面还包含一个按钮,允许他们上传附件。如果用户在单击提交按钮保存其他数据之前上传附件,则一旦上传例程执行 Response.Redirect(Request.Url.AbsoluteUri),文本框中的值就会被清除。我尝试将要恢复的值保存到 Session 中,但我似乎无法恢复它们。调试器显示它们在那里,但是一旦执行了 Response.Redirect,下一行就永远不会执行。我是 ASP.NET 的新手,所以我可能只是遗漏了一些明显的东西。这是上传过程的代码:

Protected Sub Upload(sender As Object, e As EventArgs) Handles btnUpload.Click
    Session("Phone") = txtPhone.Text
    Session("Name") = txtName.Text
    Session("Email") = txtEmail.Text
    Session("StartDate") = txtStartDate.Text
    Session("EndDate") = txtEndDate.Text
    Session("Subject") = txtSubject.Text
    Session("Description") = txtDescription.Value
    Dim filename As String = Path.GetFileName(FileUpload1.PostedFile.FileName)
    Dim contentType As String = FileUpload1.PostedFile.ContentType
    Using fs As Stream = FileUpload1.PostedFile.InputStream
        Using br As New BinaryReader(fs)
            Dim bytes As Byte() = br.ReadBytes(fs.Length)
            Dim constr As String = ConfigurationManager.ConnectionStrings("EngineeringRequestsConnectionString").ConnectionString
            Using con As New SqlConnection(constr)
                Dim query As String = "insert into Attachments values (@id, @Name, @ContentType, @Data)"
                Using cmd As New SqlCommand(query)
                    cmd.Connection = con
                    cmd.Parameters.Add("@id", SqlDbType.Int).Value = nextId
                    cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = filename
                    cmd.Parameters.Add("@ContentType", SqlDbType.NVarChar).Value = contentType
                    cmd.Parameters.Add("@Data", SqlDbType.VarBinary).Value = bytes
                    con.Open()
                    cmd.ExecuteNonQuery()
                    con.Close()
                End Using
            End Using
        End Using
    End Using
    hasUpload = True
    Response.Redirect(HttpContext.Current.Request.Url.AbsoluteUri)
    BindGrid()

End Sub

BindGrid() 过程尝试从 Session 中恢复值,但从未被执行。

If hasUpload Then
        txtPhone.Text = CType(Session("Phone"), String)
        txtName.Text = CType(Session("Name"), String)
        txtStartDate.Text = CType(Session("StartDate"), String)
End If

这是我关于 SO 的第一篇文章。如果不够清楚,请提前道歉。

【问题讨论】:

  • 好吧,如果您重定向到另一个页面,那么显然以下代码将永远不会执行(或者至少永远不会看到结果),因为您重定向到的新页面会被执行并发送而是浏览器。你还期待什么?即使您的重定向转到同一页面,它也会创建该页面的新刷新,并从page_load 事件开始执行,就好像之前的执行上下文从未发生过一样。我认为您不需要重定向。如果你只是让页面完成,你最终会得到网格绑定。也许你需要研究一下 ASP.NET 页面生命周期
  • 正如我所说,我是 ASP.NET 的新手,并试图让我的头脑围绕这些行为。我会尝试删除重定向,看看是否能解决问题。

标签: asp.net vb.net


【解决方案1】:

如果您是 ASP.NET 网络表单的新手,可能值得查看Page Lifecycle,因为它规定了加载页面时触发事件的顺序。问题是您实际上是在将用户从页面 A 带到页面 B,但希望他们在页面 A 上看到结果。

在你的方法中

Protected Sub Upload(sender As Object, e As EventArgs) Handles btnUpload.Click
  .. skip ..
  Response.Redirect(HttpContext.Current.Request.Url.AbsoluteUri)
  BindGrid()

当您调用 Response.Redirect() 时,浏览器将重定向到新页面(例如从 A -> B),这将重新开始页面生命周期,Response.Redirect() 之后发生的任何事情都不会被呈现。我认为让您感到困惑的是您是从 (A -> A) 重定向的,但这仍然会导致页面重新加载。

一种选择是调用BindGrid() 并在其中一个页面加载事件中重新加载会话中的数据,或者同时删除对Response.Redirect() 的调用并保持页面不变。

【讨论】:

  • 谢谢!这让我获得了完成这项工作所需的信息。在这里是全新的,它不会让我对此表示赞同。
  • 是的,起初错过了这个选项。现在明白了。
猜你喜欢
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
相关资源
最近更新 更多