2011-12-29 65 views
4

我對ASP/C#有些新鮮感,並且遇到會話變量的問題(可能很簡單)。我的項目有一個Site.Master,會話變量在Page_Load方法下設置,如下所示:ASP/C#會話變量 - 對象引用未設置爲對象的實例

protected void Page_Load(object sender, EventArgs e) 
    { 

     if ((Session)["UserID"]==null || (Session)["UserID"].ToString() == "") 
     { 
      (Session)["UserID"] = HttpContext.Current.User.Identity.Name.ToString(); 
      SqlDataReader dr = Sprocs.GetPermissionGroups(); 

      string groupList = ""; 

      while (dr.Read()) 
      { 
      if (groupList != "") 
        { 
         groupList = groupList + "|" + dr["WG_Group"].ToString(); 
        } 
        else 
        { 
         groupList = dr["WG_Group"].ToString(); 
        } 
      } 
      dr.Close(); 

      if (groupList != "") 
      { 
       (Session)["UserGroups"] = groupList; 
      } 
     } 

這是行不通的。如果我將會話變量'UserGroups'轉儲到標籤或此方法中的某個部分,它會正確顯示變量內容。

因此,當我嘗試訪問相同的會話變量時,我的問題出現在另一個頁面(比如default.aspx)中。在另外一個頁面的Page_Load方法我試圖做到這一點:

protected void Page_Load(object sender, EventArgs e) 
    { 
      string GroupList = HttpContext.Current.Session["UserGroups"].ToString(); 
      //some code with the variables here 
    } 

這總是失敗,並「未將對象引用設置到對象的實例。」錯誤。我試圖讓Session變量錯誤嗎?我試過

string GroupList = Session["UserGroups"].ToString(); 

這也是同樣錯誤的錯誤。

string GroupList = (string)(Session["UserGroups"]); 

這總是返回一個空字符串。

我在做什麼錯?

謝謝!

+0

你打到第二頁之前的第一頁? – 2011-12-29 16:05:00

+0

你在web.config中設置了什麼會話狀態? – 2011-12-29 16:06:59

+0

第一頁應該先載入。我瞭解site.master和使用它的任何頁面的方式是,首先加載site.master,然後加載使用它的頁面。 至於web.config,在下我有\t \t Seril 2011-12-29 16:10:31

回答

7

您在Page_Load方法中使用的語法我甚至不希望編譯。無論如何,問題是您沒有使用該密鑰設置會話,因此它將返回null。當您致電ToString()時,您會收到異常。在你的第二個例子:

string groupList = (string)(Session["UserGroups"]) 

這是做零到string轉換,這將導致一個空字符串(因此不會造成例外)。

你應該能夠重寫Page_Load實現像這樣:

string sessionUserId = Session["UserId"] as string; 

if(string.IsNullOrEmpty(sessionUserId)) 
{ 
    Session["UserId"] = HttpContext.Current.User.Identity.Name.ToString(); 

    SqlDataReader dr = Sprocs.GetPermissionGroups(); 

    string groupList = ""; 

    while (dr.Read()) 
    { 
     if (groupList != "") 
     { 
      groupList = groupList + "|" + dr["WG_Group"].ToString(); 
     } 
     else 
     { 
      groupList = dr["WG_Group"].ToString(); 
     } 
    } 
    dr.Close(); 

    Session["UserGroups"] = groupList; 
} 

然後,後來訪問會話變量時,做它像這樣:

string userGroup = Session["UserGroups"] as string; 

這是一種安全的方式來嘗試將會話中的任何存儲桶轉換爲字符串。如果密鑰不存在,或者該值不是字符串,則會得到null。否則,您將從該散列獲取字符串。

+0

好吧,這對我爲什麼會得到錯誤並確保'以字符串形式'來阻止它發生是有意義的。 雖然這確實提出了另一個問題。不知道怎麼說最好的方法是。所以上面這段代碼就是說使用Site的default.aspx。Master和它的Page_load來設置變量。如果我從default.aspx開始,那麼由於某種原因,當我檢查default.aspx的page_load中的會話變量時,它們是空白的。如果我導航到另一個頁面,然後返回它們被填充。 Site.Master會在default.aspx的page_load之後加載嗎? – Seril 2011-12-29 16:24:07

+0

母版頁將在子頁面之前執行它的'Page_Load'事件。我會驗證你的母版頁中沒有做什麼奇怪的事情會影響事情。此外,你的孩子'Page_Load'調用'HttpContext.Current.Session'而不是'this.Session' - 雖然它應該是不相關的,但要確保你是一致的。 – Tejs 2011-12-29 16:36:11

+0

好吧我弄明白了。在做了一些測試並閱讀後,確實出現了site.master的page_load會在default.aspx的page_load之後發生,這解釋了我所看到的內容。將我的會話變量代碼移到Global.asax中的Session_Start方法中,它似乎像我想要的那樣工作。再次感謝您的幫助! – Seril 2011-12-29 17:32:55

相關問題