2010-04-02 62 views
7

考慮需要設置會話變量的ASP.NET MVC應用程序。它在整個應用程序中使用。它將通過讀取瀏覽器cookie上的哈希值或用戶登錄後進行設置。ASP.NET MVC:確保用戶始終擁有會話變量集

在WebForms +主頁面模型中,我會檢查母版頁的Page_Load()。也許不是最終的事件,但它很容易找到。

你將如何檢查和強制ASP.NET MVC中的會話變量的存在?考慮到這個問題可能不涉及用戶登錄細節,但可能包含其他一些數據(可能是第一次訪問時間)。

解決方案嘗試

public void Application_BeginRequest(Object source, EventArgs e) 
{ 
    HttpApplication application = (HttpApplication)source; 
    HttpContext context = application.Context; 

    context.Session["SomeDateTime"] = DateTime.Now.ToString(); 

    // results in Object reference not set to an instance of an object. 
    // context.Session is null 
} 
+0

你試過使用Application_PreRequestHandlerExecute嗎? – Kiquenet 2016-06-22 10:43:39

回答

10

你有兩個選擇。在基本控制器的功能Initialize

假設所有的控制器從基本控制器繼承

1.Place邏輯,你可以放置在基本控制器的功能Execute()的覆蓋所需的邏輯。

public class BaseController : Controller 
{ 
    public BaseController() 
    { 

    } 

    protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
    { 
      // check if the user has the value here using the requestContext.HttpContext object 
    } 
{ 

2.使用在Global.asax void Application_PreRequestHandlerExecute(Object source, EventArgs e)功能

public void Application_PreRequestHandlerExecute(Object source, EventArgs e) 
{ 
    HttpApplication application = (HttpApplication)source; 
    HttpContext context = application.Context; 

    // use an if statement to make sure the request is not for a static file (js/css/html etc.) 
    if(context != null && context.Session != null) 
    { 
      // use context to work the session 
    } 
} 

注:第二部分適用於任何ASP.NET應用程序的WebForms或MVC。

至於enforcing他們有一定的會話變量,它真的很開放。您可以重定向到某個頁面,以便填寫表單或選擇一個選項或其他內容。或者,如果找不到某個會話密鑰,可能只需要設置一個默認值即可。

編輯

雖然玩這個,我注意到Application_PreRequestHandlerExecute辦法的一個大問題。該事件處理程序正在調用對服務器的任何請求,無論是.css/.js/.html文件。我不確定這是否是我的工作站設置方式的問題,或者只是ASP.NET/IIS的工作原理,所以我會確保在實現上述方法時不會在所有請求中調用此方法。

由於之前的原因,我把這項工作用if聲明包裹在會議中。

+0

@Baddie - 感謝您的建議!不幸的是,第二個選項導致「未設置對象引用」。我已經用細節更新了這個問題。再次感謝! – 2010-04-02 14:06:16

+0

更新了我的答案。您需要使用Application_PreRequestHandlerExecute事件而不是Application_BeginRequest,因爲Session不是在那裏建立的。看看我的編輯。 – Omar 2010-04-05 12:48:16

+0

@Omar這對我有幫助,選項1.需要檢查管理員狀態的用戶角色,並在每個操作執行前將會話或會話存儲在會話中。謝謝。 – webtrifusion 2011-08-19 16:29:51

2

不知道我完全理解這個問題,但我通過覆蓋控制器的OnActionExecuting方法來做到這一點。

在那裏您可以執行代碼以查看會話變量是否存在。如果沒有,創建它,如果是的話就使用它。

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    if (filterContext.HttpContext.Session != null) 
    { 
     //TODO: Get value from session etc. 
    } 
    base.OnActionExecuting(filterContext); 
} 
0

作爲另一種選擇,ControllerActionInvoker類調用每個操作方法;它通過控制器工廠分配給控制器。所以你可以繼承這個動作調用器,每次一個動作被調用時(通過覆蓋InvokeAction方法)在這裏檢查這個存在......