Response.Redirect(Request.Url.AbsoluteURI)清除所有用户条目

时间:2017-07-25 10:18:40

标签: asp.net vb.net

我有一个页面,用户填写一些文本框,使用“提交”按钮将其保存到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上的第一篇文章。如果事先不清楚,我会提前道歉。

1 个答案:

答案 0 :(得分:1)

如果您是ASP.NET webforms的新手,可能需要查看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()的调用,而不是按原样保留页面。