2012-05-23 24 views
0

我的項目中有很多頁面。在所有的網頁我寫的:從視圖狀態獲取值,以防會話過期

if (!IsPostBack) 
{  
    if (HttpContext.Current.Session["curUserRole"] == null) 
    { 
     DBUsers.SetUserStatusOnline("0", ViewState["curUserLogin"].ToString()); 
     ViewState["curUserLogin"] = ""; 
     Response.Redirect("~/Login.aspx"); 
    } 
    else 
    {  
     ViewState["curUserLogin"] = HttpContext.Current.Session["curUserLogin"].ToString(); 
     DBUsers.SetUserStatusOnline("1", ViewState["curUserLogin"].ToString()); 
    } 
} 

當用戶登錄在網站上,目前的用戶角色被寫入的會話和當前用戶登錄是寫在視圖狀態。當會話結束時,我認爲我可以在視圖狀態中查看當前用戶登錄並在數據庫中設置脫機狀態。但是當session爲空時,viewstate也爲空。我能做什麼?

回答

0

除了UnhandledException的回答之外,我還補充說,把你的邏輯集中在一個班級中,然後從這個新班級中派生你的頁面,而不是將它們剪切並粘貼到每個頁面可能會更好:

public class MyPageClass : System.Web.UI.Page 
{ 
    protected override void OnLoad(EventArgs e) 
    { 
     // Add your logic here. 

     base.OnLoad(e); 
    } 
} 

public class WebPage1 : MyPageClass 
{ 
    private void Page_Load(object sender, System.EventArgs e) 
    { 
    } 
} 
+0

好的。如何保存用戶登錄並在任何頁面重新加載和會話爲空時調用此方法? –

+0

我的回答是關於如何集中您的邏輯,而不是將它剪切粘貼到每個頁面的建議。您需要查看'UnhandledException'的答案,以解決從另一個頁面重定向時出現null'ViewState'的問題。 – CAbbott

+0

@DarienFawkes - 雖然我很欣賞代表,但我不認爲我的答案能解決您的問題。沒有'UnhandledException'的答案解決了你的問題?如果是這樣,你應該真的接受他的答案。 – CAbbott

1

不會使用Forms Authentication是一種更好的方法,而不是手動處理角色,視圖狀態和會話?

通過這種方式,您可以與當前的Identity進行交互以獲取用戶信息,而不是定製存儲信息。

而且我認爲你可能不應該依靠用戶回發來確定會話是否已經過期。如果用戶只關閉瀏覽器會怎麼樣?他/她將無限期地保持「在線」狀態。

您應該提供一個用戶手動註銷的機制。

現在,如果您正在爲會話狀態使用InProc,則可以在global.asax中處理Session_End以將該用戶設置爲數據庫中的「離線」。 如果您使用的是StateServer或SQLServer,則在超時時不會調用Session_End,並且您必須以自定義的方式處理它,例如通過數據庫服務器上的計劃任務將用戶標記爲脫機。

現在,如果您確實需要非常精確地控制在線/離線狀態,則可能需要採取更復雜的方法。一種選擇是,只要用戶執行任何操作,就在用戶表上存儲最後一個活動的日期時間。並且考慮在特定時間內沒有做任何活動的任何用戶離線。 另一種選擇是將ajax調用用作keep-alive調用來更新上述日期時間。