我有一个页面,用户在其中填写一些文本框,这些文本框使用"提交"按钮保存到SQL数据库中。 该页面还包含一个按钮,允许他们上传附件。 如果用户在单击提交按钮保存其他数据之前上传附件,则一旦上传例程执行响应.重定向(请求.Url.AbsoluteUri(,文本框中的值将被清除。 我尝试将要还原的值保存到会话中,但似乎无法还原它们。 调试器显示它们在那里,但是一旦执行了响应.重定向,下一行就永远不会执行。 我是 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(( 过程尝试从会话恢复值,但从未执行。
If hasUpload Then
txtPhone.Text = CType(Session("Phone"), String)
txtName.Text = CType(Session("Name"), String)
txtStartDate.Text = CType(Session("StartDate"), String)
End If
这是我关于SO的第一篇文章。如果不够清楚,我提前道歉。
如果您不熟悉 ASP.NET Web 表单,可能值得查看页面生命周期,因为这决定了加载页面时触发事件的顺序。问题是,您有效地将用户从页面 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()
一起的调用,而是保持页面原样。