2009-08-02 62 views
2

首先,感謝您的閱讀。ASP.NET在重定向和回發之間傳遞值

我會盡我所能描述我的情況。

我有一個頁面,用戶可以留言。 這裏的評論流程

  • A-1。點擊'評論'按鈕
  • A-2。使用ajaxtoolkit中的ModalPopupExtender顯示帶有文本框的模式彈出窗口。
  • A-3。用戶在文本框中鍵入評論,然後單擊「確定」。

但是,當用戶未登錄時,預期的行爲會發生變化。

  • B-1。點擊'評論'按鈕
  • B-2。顯示登錄模式彈出式窗口,編號爲& pwd文本框。
  • B-3。用戶類型ID & pwd,然後單擊確定。
  • B-4。評論模式彈出顯示
  • B-5。用戶輸入評論並單擊確定。

我有處理這種情況的問題。

當B-3發生時,頁面被回發,我登錄用戶,更新會話對象,並且我將Response.Rediect()頁面顯示給自己以顯示正確的登錄狀態(我必須... )。 重定向後,在Page_Load()中,我需要檢查一些值以顯示Comment-Modal-Popup。 但我不知道如何..

這裏就是我認爲

  • 的ViewState
    • 我只是不能使用它,因爲頁面被重定向沒有調回。
  • 查詢字符串
    • 我可以重定向時添加 「showCommentPopup = 1」 的網址,但會留下不必要的查詢字符串URL中。我不希望用戶濫用它。
  • 會議
    • 我實際使用Session對象。在重定向之前,我將Session [「ShowCommentPopup」]設置爲true。在Page_Load()中,如果它已設置,我將其刪除並顯示彈出窗口。

使用會話像我一樣不正確,當用戶打開同一個頁面中的多個標籤的工作。

  1. 用戶打開兩個選項卡(在Firefox)與相同的URL
  2. 用戶跟隨在第一凸片從B-1至B-3步驟。
  3. 在頁面被重定向到B-3和B-4之前,用戶刷新第二個選項卡。
  4. 如果時機正確,則在第二個選項卡中顯示註釋彈出窗口。

我希望聽到來自計算器有着深刻的見解..

+0

爲什麼你*有*重定向到處理登錄?通常情況下,如果您已經提示輸入姓名和密碼,則無需重定向即可。 – Thorarin 2009-08-02 16:12:39

+0

你是對的,我可以在不重定向的情況下處理登錄。它顯示正確的登錄狀態,我不能這樣做..該頁面使用黑盒控件來顯示登錄狀態,並且它只顯示頁面重定向後正確的登錄狀態..... – wooohoh 2009-08-02 16:43:04

回答

3

如果您存儲ShowCommentPopup標誌HttpContext.Items集合中,而不是在會話,然後我還沒有試過,但我認爲,使用Server.Transfer而不是Response.Redirect你應該能夠達到預期的結果。

HttpContext.Items是一個字典,可以用來存儲數據的生命週期是請求的生命週期。這意味着來自不同選項卡或窗口的第二個請求將具有不同的HttpContext.Items字典。

Server.Transfer有點像在Response.Redirect它允許你加載一個「與衆不同」的網址,而不是原來的。但是,當Reponse.Redirect發起新請求時,Server.Transfer將現有請求傳輸到服務器上的新頁面。

Response.RedirectServer.Transfer之間的差異的更好的解釋可以發現here


bool showCommentPopup = false; 
if (HttpContext.Current.Items["ShowCommentPopup"] != null) 
{ 
    showCommentPopup = (bool)HttpContext.Current.Items["ShowCommentPopup"]; 
} 

//... 

HttpContext.Current.Items["ShowCommentPopup"] = true; 
0

你已經清楚地認爲通過您的解決方案!我猜測Session的問題在於,他們可以在與他們登錄的頁面不同的頁面上發表評論。你可以解決這個問題通過存儲會話變種,而不是一個布爾值,但隨着頁顯示它:

var uniqueString = this.ToString() + uniquePageID; 
if (Session["ShowCommentPage"].ToString() == uniqueString) 
    //show modal & remove session var 

現在你的程序只「休息」當用戶訪問同一個對象在兩個不同的窗口,在Window#1上登錄,並在Window#2上刷新。而且,它們並沒有真正突破,因爲他們以任何一種方式結束對同一個對象的評論。

我使用uniquePageID的原因是因爲我想你有一個模板頁面(「showObject.aspx」),其參數要顯示(「showObject.aspx?objectID = 3」)。爲了確保評論留在同一個ID,它需要存在於uniqueString

+0

是這種方法的工作原理用戶不會在錯誤的頁面上留言。仍然可以在#2窗口中顯示彈出窗口,而不是在觸發整個事件的窗口#1中顯示。我認爲這是用戶體驗中的一個問題。最好,我希望我也能解決這個問題。 – wooohoh 2009-08-02 16:53:01