2010-05-26 61 views
1

用戶將使用特定參數訪問我的網站,例如: http://www.mysite.com/whatever/?keepTrackOfThisValue=foohttp://www.mysite.com/who/cares/?keepTrackOfThisValue=bar在會話中何處保留查詢字符串參數?

我想存儲在會話這一特殊參數的值,每次我發現它在查詢字符串。我目前在Global.asax中使用Session_Start事件來存儲這個,但是我想在每次參數值改變時覆蓋這個值,這在我的方式中是不可能的。

你會這樣做?

回答

2

嘗試從Session_Start移動它Application_BeginRequest

+0

+1就是這樣...... – eglasius 2010-05-26 16:47:06

+0

事實上,Session不可用是Application_BeginRequest:它會拋出一個異常說「會話狀態在此上下文中不可用」,並且HttpContext.Current.Session爲空。 雖然,您間接地指出我可以使用Session的Application_AcquireRequestState事件! – hoang 2010-05-27 08:20:37

0

如果存在,爲什麼不將它存儲在Page_Load事件中?如果它不涉及Session的值。

你甚至可以創建一個基本頁面的所有網頁的,對於QueryString是否存在等你有興趣的檢查。

一個MasterPage與AA公共屬性來訪問這個值inheirit也將是有益的,如:

// in your master page 
public string YourSessionVariable 
{ 
    get 
    { 
     string yourValue = "SomeDefault"; // if session expired and param not passed 
     if (Request.QueryString["yourQueryParamName"] != null) 
     { 
      Session["yourSessionParamName"] = Request.QueryString["yourQueryParamName"]; 
     } 
     return (Session["yourSessionParamName"] == null) ? 
      yourValue : Session["yourSessionParamName"].ToString(); 
    } 
} 

// Then in your pages your can just fetch it anytime with 
Master.YourSessionVariable 
0

這要看我是如何使用它,但有一件事我做同樣是一個靜態類,其中,當吸氣劑稱爲小包裝特性,將有選擇地設置會話如果查詢字符串不同,然後返回會話

0

每一頁上的Page_Load哪裏可能發生此查詢字符串時就做

if(Session["keyName"] != null) 
{ 
    Session["permitError"] = querysting; 
} 
else 
{ 
    Session.Add("keyName", value); 
} 
+0

該解決方案顯然是工作,但每次修改的Page_Load事件是不是我的選擇。 – hoang 2010-05-27 08:28:26

1

有(至少)兩種方式,你可以去這個...

1)使用一個HttpModule來掛接到應用程序的BeginRequest方法,如this page中所述。

2)創建一個從您的應用程序中的所有頁面繼承的基類(從System.Web.Page繼承)。然後使用此基類中的Page_Load方法將相同的功能推送到您的所有頁面中。這還允許您在Load或任何其他事件中添加您可能需要的所有頁面上的其他常用功能。您也可以使用它來爲所有頁面定義公共屬性。

我從來沒有試過#1,但我在編寫的每個Web應用程序中都使用了#2。例如,在我的PageBase類中,我提供了一個只讀的基本屬性,它公開了一個數據庫連接獲取機制,因此每個頁面都可以輕鬆訪問數據庫,而無需編寫自己的代碼以從池中獲取連接。它可以導致整體更清潔的代碼。

+0

好的答案,但我忘了提及,我已經有一些從System.Web.Page繼承的基類,我不想在幾個地方修改Page_Load事件。我正在尋找更全面的解決方案。 – hoang 2010-05-27 08:26:06

+0

在這種情況下,我會建議使用#1,因爲這會在應用程序級別掛鉤一個,或者讓一個共同的基類從你的其他人全部繼承,這是你的100%普通基礎,並把這個和任何其他100在這一個類中共同的代碼。 – eidylon 2010-05-27 14:25:37

0

string StrQuery;

StrQuery = Request.QueryString [「value」]。ToString();

Session [「SessionValue」] = StrQuery;