2012-05-03 34 views
3

這回發後空是我的代碼是在頁面加載運行:ASP.NET會話成爲當地

protected void Page_Load(object sender, EventArgs e) 
{ 
    DisableChaching(); 
    if (Request.Cookies["UserName"] == null) 
    { 
     if (Session["UserName"] == null) 
     { 
      Response.Redirect("~/Default.aspx"); 
     } 
     else if (Session["AccessLevel"].ToString().Equals("2")) 
     { 
      Response.Redirect("~/Default.aspx"); 
     } 
    } 
    else if (Session["AccessLevel"].ToString().Equals("2")) 
    { 
     Response.Redirect("~/Default.aspx"); 
    } 
    if (!IsPostBack) 
    { 
     LoadControls(); 
     BindGrid(); 
    } 
} 

有時,當我嘗試保存一些數據的數據庫,我得到一個錯誤,我嘗試點擊我的保存按鈕重新保存的數據,我得到這個錯誤:

Object reference not set to an instance of an object

上以下行,如果代碼:

else if (Session["AccessLevel"].ToString().Equals("2")) 

爲什麼我得到這個錯誤?

這裏是我在登錄用戶的控制代碼,其中CHR是複選框記住用戶:

if (ChR.Checked == true) 
      { 
       Response.Cookies["UserName"].Value = txtUserName.Text.Trim(); 
       Response.Cookies["UserName"].Expires = DateTime.Now.AddMonths(2); 
       Response.Cookies["AccessLevel"].Value = member.AccessLevel.ToString(); 
       Response.Cookies["AccessLevel"].Expires = DateTime.Now.AddMonths(2); 
       Response.Cookies["FirstName"].Value = member.FirstName; 
       Response.Cookies["FirstName"].Expires = DateTime.Now.AddMonths(2); 
       Response.Cookies["LastName"].Value = member.LastName; 
       Response.Cookies["LastName"].Expires = DateTime.Now.AddMonths(2); 
       Session["UserName"] = txtUserName.Text.Trim(); 
       Session["AccessLevel"] = member.AccessLevel.ToString(); 
       Response.Redirect("~/Default.aspx"); 
      } 
      else 
      { 
       Session["UserName"] = txtUserName.Text.Trim(); 
       Session["AccessLevel"] = member.AccessLevel.ToString(); 
       Session["FirstName"] = member.FirstName; 
       Session["LastName"] = member.LastName; 
       Response.Redirect("~/Default.aspx"); 
      } 

,並在我的母版頁我這樣在Page_Load事件賦值會話:

DisableChaching(); 
    FillInfo(); 
    if (Request.Cookies["UserName"] != null) 
    { 
     Session["UserName"] = Request.Cookies["UserName"].Value; 
     Session["AccessLevel"] = Request.Cookies["AccessLevel"].Value; 
     Session["FirstName"] = Request.Cookies["FirstName"].Value; 
     Session["LastName"] = Request.Cookies["LastName"].Value; 
     WellCome(); 
     if (Session["AccessLevel"].ToString() == "1") 
     { 
      RenderMenu(AcccessLevel.SiteManager); 
     } 
     else if (Session["AccessLevel"].ToString() == "2") 
     { 
      RenderMenu(AcccessLevel.Client); 
     } 
    } 
    else if (Session["UserName"] != null) 
    { 
     WellCome(); 
     if (Session["AccessLevel"].ToString() == "1") 
     { 
      RenderMenu(AcccessLevel.SiteManager); 
     } 
     else if (Session["AccessLevel"].ToString() == "2") 
     { 
      RenderMenu(AcccessLevel.Client); 
     } 

    } 
    else 
    { 
     WellGo(); 
     RenderMenu(AcccessLevel.LogedOutUser); 
    } 
enter code here 
+0

你讀過這篇文章http://arstechnica.com/civis/viewtopic.php?f=20&t=220827? –

+0

喬不曾有過這樣的問題嗎?!這可能會給你一個想法什麼可能是錯的?你看到我的代碼有什麼不對嗎?也是我的代碼來設置會話值: – Karamafrooz

+0

也許你正在失去會話,因爲應用程序域回收。 http://blogs.msdn.com/b/tess/archive/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles.aspx –

回答

4

之間的區別,我想我找到了,爲什麼我的會話成爲空!當我想用db保存有關圖書的信息並將圖書的圖像文件保存在應用程序文件夾中時,我沒有保存該文件的權限,我的應用程序會拋出錯誤,並且所有會話都變爲空!

+0

這意味着,如果有任何應用程序錯誤會話變爲空! – HydPhani

0

Why am I getting this error?

因爲Session["AccessLevel"]爲空,所以您試圖調用Null對象的方法。

1

替換您的代碼,如下所示。

string val = Convert.ToString(Session["AccessLevel"]); 
if (val == "2") 
{ 

} 

我希望你明白==Equals()

public static String AccessLevel { 
    get 
    { 
     return Convert.ToString(HttpContext.Current.Session["AccessLevel"]); 
    } 
    set 
    { 
     HttpContext.Current.Session["AccessLevel"] = value; 
    } 
} 
+0

如果會話再次爲空我會在你的第一行代碼相同的錯誤! – Karamafrooz

+0

您可以省略String.IsNullOrEmpty調用,因爲空字符串和空值在測試'val =='2''時會返回false' –

+0

'Convert.ToString'永遠不會拋出錯誤,如果該值在'session變量'相同的空值將被返回給字符串變量。你測試了上面提到的代碼嗎? – Pankaj

0

對於其他用戶,請檢查您的會話超時。可能是這個問題。你可以使用

<system.web> 
    <authentication mode="Forms"> 
     <forms timeout="50"/> 
    </authentication> 

    <sessionState timeout="60" /> 
</system.web>