2011-03-14 36 views
5

我的表單身份驗證cookie仍然存在,但我的會話丟失或重建項目時,我已經開始遇到錯誤。ASP.Net MVC 3:在哪裏處理會話丟失?

在WebForms中,我會使用與需要登錄的頁面關聯的主頁面來檢查會話。

我該如何在MVC中的一個位置執行此操作?我討厭在我的控制器中檢查會話狀態。

另一方面,我不能只應用一個全局過濾器,因爲並不是所有的控制器都需要會話狀態。

在我的佈局視圖中可能有可能嗎?這是需要會話的頁面唯一共同的東西。

回答

2

你可以做的一件事是對需要會話狀態的控制器進行子類化。這樣你可以在這個基礎控制器上創建一個過濾器。這可以讓你在一個地方做到這一切。此外,正如您所指出的那樣,全局過濾器不會對您有所幫助,因爲邏輯不適用於每個控制器。

+0

+1這似乎是一個好主意,但是控制器是否有一箇中心入口點,我可以檢查? (對於我的基礎控制器) – Steffen 2011-03-15 06:16:33

+0

@Steffen - 您的目標是保持乾燥,並且只有代碼中的邏輯一次。因此,您創建了一個基本控制器,您只需從* *繼承此功能所需的控制器。然後,您可以將過濾器應用於此控制器的類聲明,以便它可以爲控制器(或其任何子類)執行的所有操作方法運行。 – 2011-03-15 12:52:29

+0

我明白了,謝謝闡述:-) – Steffen 2011-03-16 20:27:49

2

將其添加到會話開始。如果發生會話丟失,它也需要觸發會話開始。你可以處理它有如下:

protected void Session_Start(object src, EventArgs e) 
    { 
     if (Context.Session != null) 
     { 
      if (Context.Session.IsNewSession) 
      { 
       string sCookieHeader = Request.Headers["Cookie"]; 
       if ((null != sCookieHeader) && (sCookieHeader.IndexOf("ASP.NET_SessionId") >= 0)) 
       { 
        // how to simulate it ??? 
        // RedirectToAction(「ActionName」, 「ControllerName」, route values); 
        Response.Redirect("/Home/TestAction"); 
       } 

      } 
     } 


    } 
0

我什麼史蒂夫已經提到的同意,但我建議使用,而不是爲所有人創造你的控制器基類全局過濾器。原因是每次你創建一個新的控制器時,你都應該記得從基本控制器派生出來,否則你可能會在應用程序中經歷隨機行爲,這可能需要幾個小時的調試。當你停止開發一段時間然後再回頭時,這一點尤爲重要。

此外,另一個原因是「贊成組合繼承」的原則。