2012-01-06 71 views
0

我一直在研究一個小應用程序,它最近由一個索引頁面組成,這個索引頁面包含幾個運行數據庫的報表,然後是一些用於更新該頁面內容的表單使用C#,以便將來學習如何使用MSCharts。Response.Redirect和MSCharts

索引頁面可以顯示我設置的5個報告中的任何一個,通過下拉框選擇。默認情況下,第一個選擇是應該總是在頁面上顯示一個圖表。

我得到了圖表的功能,並顯示我希望他們在索引頁上的罰款,並更新數據庫的表單也做了他們的工作。但是,當我點擊其中一個頁面上的「退出」按鈕(將用戶發送回索引頁面)時,應該在那裏顯示的圖表只是一個紅色的「x」,就好像圖像不存在一樣。如果我刷新頁面,它應該會顯示。

當時的退出按鈕使用Response.Redirect()將用戶發送回索引頁,我花了一些時間來確認這是正確的方法。最後,我嘗試切換到使用Server.Transfer(),儘管每個站點似乎都表明在頁面執行週期方面兩者之間沒有主要區別 - 只有Response.Redirect()發送了整個新的請求,而Server.Transfer沒有。

儘管如此,使用Server.Transfer()修復了這個問題。那太好了!

任何人都可以解釋爲什麼這工作?

更新 - 一些代碼,以防萬一它有幫助。

來自更新表單的問題之一 - 最初使用的Response.Redirect()當然。

protected void Exit_Click(object sender, EventArgs e) 
    { 
     Server.Transfer("Default.aspx"); 
    } 

從Default.aspx的在Page_Load:

protected void Page_Load(object sender, EventArgs e) 
    { 
     Report report = new Report(reportList.SelectedIndex); 
     ChartPanel.Controls.Add(report.Chart); 
    } 

報告類概要 - 這基本上是我在createChartFromParameters規定的各種報告()方法的包裝。它只是完成設置圖表的所有工作,因此它不會在UI中結束,然後讓UI獲取圖表對象本身。如果有人會覺得它有用,我可以發佈實現,但它很醜,因爲任何事情都很囉嗦,所以我寧願不要。

public class Report 
{ 
    private Chart chart { public get; } 

    public Report(string title, string command, string x, string y, string label, string legend, SeriesChartType type) 

    public Report(int presetChartNum) 

    private void createChartFromParameters(string title, string command, string x, string y, string label, string legend, SeriesChartType type, int customcode = 0) 
} 
+0

很難說,不看代碼。我唯一能猜到的就是Server.Transfer停止執行並立即重定向響應的地方。重定向將完成執行,並可能有一些意外的代碼正在運行,產生問題 – user1231231412 2012-01-06 14:26:17

+0

我會彈出一些代碼,只是爲了興趣,但說實話我不認爲我可以發佈足夠的 - 真正看到發生了什麼我' d需要上傳大約一半的應用程序代碼,並且我不想讓任何人通過閱讀我的許多代碼的折磨:P – Hecksa 2012-01-06 14:37:20

+0

**更新**:添加了代碼。 – Hecksa 2012-01-06 14:49:45

回答

1

我相信這是一個如何在服務器對象和響應對象進行重定向

它有很多做的客戶端如何重定向到新的資源,並從什麼目的的誤解它這樣做,以及之後可以訪問哪些對象。

我可以全部輸入,但這裏有一個很好的資源。

http://techahead.wordpress.com/2007/10/14/aspnet-servertransfer-vs-responseredirect/

+0

偉大的文章,謝謝。我尋找這樣的一段時間,但找不到一個徹底。 雖然看過了,但我看不出是什麼導致了我的情況有所不同。我的代碼在頁面從無內容加載時運行良好,這正是Response.Redirect似乎在做的事情,我看不到任何代碼在重定向過程中仍可能正在運行,正如Jon C在他的評論中所建議的。 Response.Redirect和瀏覽器的URL欄之間是否存在一些根本區別?我相信都從頭開始HTTP請求,所以不應該結果是相同的? – Hecksa 2012-01-06 15:07:40

+0

並非如此,Response.Redirect實際上是停止當前響應對象並啓動一個新對象,並生成一個新對象,因此ThreadAbort異常如http://msdn.microsoft.com/en-us/library/a8wa7sdt %28VS.80%29.aspx在地址欄輸入網址開始一個新的頁面生命週期。我懷疑這就是爲什麼刷新工作的重定向沒有。 – Sabre 2012-01-06 15:14:10

+0

Gotcha。如果Response.Redirect沒有開始一個全新的生命週期,那麼我可以想到有幾件事情可能會導致問題的產生。非常感謝 :) – Hecksa 2012-01-06 15:24:31