2017-07-25 93 views
2

我有一個頁面,用戶填充一些文本框,使用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

回答

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()的呼叫,而保持原樣。

+0

謝謝!這給我提供了我需要的信息來實現這一目標。作爲全新的品牌,它不會讓我高興。 – KBatz

+0

@KBatz您仍然可以將其標記爲已接受的答案,但如果您喜歡 – ADyson

+0

是,那麼首先會錯過該選項。現在明白了。 – KBatz