關於Session為null的問題。。。


具體判斷條件是Session[“username”]是否為空,如果Session[“username”].ToString()為null或者為""則表示未登陸,跳轉到一個提示頁面。具體代碼示例如下:

   

 public int IsUser()

    {

        if (Session["UserName"].ToString() == null || Session["UserName"].ToString() != null && Session["UserName"].ToString() == "")

        {

            //可能非有意的引用比較;若要獲取值比較,請將左邊轉為類型string

            //Response.Redirect   ("../index.aspx");

            //Response.Write(" <script   language=javascript> alert('你不是管理員!');location.href='Default.aspx'; </script> ");

            return 1;

        }

        else

        {

            return 0;

        }

    }

 

    樓主在運行這段代碼的時候,vs2005始終出現提示"當前上下文中不存在session",這個是因為相應的代碼環境和cs文件的位置所決定的,利用System.Web.HttpContext.Current.Session來調用Session即可。如果了解asp.net底層機制,我們就會發現,Session["UserName"],其實是HttpConText的屬性,在aspx文件關聯代碼中,其提升為Page的屬性,所以我們可以如此方便調用,而在非關聯代碼文件中,則必須通過System.Web.HttpContext.Current.Session方式調用。此時改正后的代碼示例如下(不考慮邏輯問題):

    

public int IsUser()

    {

        if (System.Web.HttpContext.Current.Session["UserName"].ToString() == null || System.Web.HttpContext.Current.Session ["UserName"].ToString() != null && System.Web.HttpContext.Current.Session ["UserName"].ToString() == "")

        {

            //可能非有意的引用比較;若要獲取值比較,請將左邊轉為類型string

            //Response.Redirect   ("../index.aspx");

            //Response.Write(" <script   language=javascript> alert('你不是管理員!');location.href='Default.aspx'; </script> ");

            return 1;

        }

        else

        {

            return 0;

        }

    }

 

其實,這里還有問題,我們拋開如上問題和其中的邏輯錯誤問題不談,有經驗的程序員,一下子就會看出問題所在。讓我們仔細分析一下,經過如上所說的修正,我們運行程序就會看到異常顯示“未將對象引用設置到對象的實例的錯誤然后調試,發現了沒有這個Session,因為還沒有創建,所以更無法使用ToString()。這樣我們明白了,在沒登陸時,Session[“username”] =null,此時條件: Session[“username”].ToString()過程中,會出現異常。我們可以想到,如果把先判斷Session[“username”] 是否為null,再判斷樓主的條件,即可。

這里有兩種方法,一種是在外層或前面再加一個if語句;另一種是采用&& 和||運算符(詳見邏輯運算符用法),把Session[“username”] ==null放到樓主所寫條件的前面,這是因為采用&& ||運算符並且Session[“username”] ==null在判斷最前,因而程序先判斷Session[“username”] =null,如果不滿足條件,則不會繼續判斷后面的條件,如果滿足條件,則繼續判斷后面的條件,而此時不具備出現異常的情況。采用如上所述方法程序程序會運行通過,無錯誤,符合功能需要(拋棄樓主條件中的邏輯錯誤)。此時修改后的代碼示例(不考慮邏輯問題)如下:

    

public int IsUser()

    {

        if((System.Web.HttpContext.Current.Session["UserName"]==null)||System.Web.HttpContext.Current.Session["UserName"].ToString() == null || System.Web.HttpContext.Current.Session ["UserName"].ToString() != null && System.Web.HttpContext.Current.Session ["UserName"].ToString() == "")

        {

            //可能非有意的引用比較;若要獲取值比較,請將左邊轉為類型string

            //Response.Redirect   ("../index.aspx");

            //Response.Write(" <script   language=javascript> alert('你不是管理員!');location.href='Default.aspx'; </script> ");

            return 1;

        }

        else

        {

            return 0;

        }

    }

 

如上只是解決了運行問題,從好的程序方面考慮,還有兩個問題:

首先,樓主在處理Session轉換為string類型時也可以采用(string)Session[“username”]的方式,此時Session[“username”]為null時,不會出現錯誤,就可不先判斷Session[“username”]是否為null。

其次,樓主采用的驗證字符串為null或""的方法很不好,應該采用如下方法:string.IsNullOrEmpty((string)Session["UserName"]),這個方法如果字符串為null或者"",則返回True,否則返回False。此時,很簡潔,而且省去很多判斷。

綜合以上,這時,可以不判斷Session ["UserName"]值為null的情況(如考慮則有助於減少實際運行時類型轉換的次數),修改后的代碼示例(修正了邏輯問題)如下:

  

  public int IsUser()

    {

        if (string.IsNullOrEmpty((string) System.Web.HttpContext.Current.Session ["UserName"]))

        {

            //可能非有意的引用比較;若要獲取值比較,請將左邊轉為類型string

            //Response.Redirect   ("../index.aspx");

            //Response.Write(" <script   language=javascript> alert('你不是管理員!');location.href='Default.aspx'; </script> ");

            return 1;

        }

        else

        {

            return 0;

        }

    }

 

深究一下,從好的設計方面來講,這里還有問題,就是樓主的登錄驗證思路設計,樓主驗證是否登陸,還要判斷Session["UserName"].ToString()為null或"",為什么呢?因為很可能樓主在退出登陸的時候,將退出代碼寫為:Session["UserName"]=""。此時就必須判斷:Session["UserName"].ToString()為""的情況。

其實,大可不必如此,退出登錄代碼寫為:

Session["UserName"]=null;

這樣,就決不會出現用戶沒有登陸,並且Session["UserName"].ToString() 為""的情況。即Session["UserName"]為null時,表示沒有登陸,而Session["UserName"]不為null時,表示已經登陸,只有這兩種情況。所以只要判斷Session["UserName"]是否為null即可斷定是否登陸。修改后的代碼示例如下:

   

 public int IsUser()

    {

        if (System.Web.HttpContext.Current.Session ["UserName"]==null)

        {

            //可能非有意的引用比較;若要獲取值比較,請將左邊轉為類型string

            //Response.Redirect   ("../index.aspx");

            //Response.Write(" <script   language=javascript> alert('你不是管理員!');location.href='Default.aspx'; </script> ");

            return 1;

        }

        else

        {

            return 0;

        }

    }

 

總結一下,這里有幾個知識點:

1、Session對象的引用問題。這個如果學習過HttpContext對象,對asp.net內部原理有了解,那很容易理解這個問題。

2、字符串為null和""的判斷問題

明確""(等於string.Empty)和null的區別。""表示內存中實際存在,表示0長度的空子符串;null表示並不存在這個量。
3、Null

表示不存在,未定義。適用引用類型,值類型不可以(值類型可以利用可空類型來實現)。

4、對象名.ToString()和(string)對象名的區別

本質上是面向對象編程的一個問題。對象名.ToString() ,這個語法告訴我們ToString()是這個對象的方法,如對象不存在為null,那么會出現錯誤,必須在這之前判斷該對象是否存在。而(string)對象名,是將指定對象轉換為string類型,如果對象為null,因為字符串也可以為null,所以不會出現錯誤。

綜上所述,本質上這是個空值判斷問題。C#2.0引入了可空類型,加上null關鍵字,就可以很好解決這類問題了。類似的,從數據庫中讀取字段的判斷也屬於這個問題,可能會出現null的情況,但有可能是值類型,這時候可空類型就有用了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM