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

问题描述:

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

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上的第一篇文章。如果事先不清楚,我很抱歉。

+0

好吧,如果你重定向到另一个页面,那么显然下面的代码将永远不会执行(或者至少,结果永远不会被看到),因为你重定向到的新页面被执行并发送到浏览器。你还期望什么?即使您的重定向转到_same page_,它也会创建该页的_new refresh_,并从page_load事件开始执行,就像前一个执行上下文从未发生过一样。我不认为你需要重定向。如果你只是让页面完成,你会最终与网格绑定好。也许你需要学习ASP.NET页面的生命周期 – ADyson

+0

正如我所说,我是ASP.NET的全新人物,并试图让我的脑袋围绕行为。我会尝试删除重定向,看看是否解决了这个问题。 – KBatz

如果您是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()的呼叫,而保持原样。

+0

谢谢!这给我提供了我需要的信息来实现这一目标。作为全新的品牌,它不会让我高兴。 – KBatz

+0

@KBatz您仍然可以将其标记为已接受的答案,但如果您喜欢 – ADyson

+0

是,那么首先会错过该选项。现在明白了。 – KBatz