2012-04-10 85 views
6

我有一個在我的MVC應用程序中設置的會話變量。無論何時該會話過期並且用戶嘗試刷新它們所在的頁面,該頁面都將引發錯誤,因爲會話不再設置。MVC等效於Page_Load

是否有任何地方可以檢查加載視圖之前是否設置了會話?也許把一些東西放在Global.asax文件中?

我可以在每個ActionResult的開頭都做這樣的事情。

public ActionResult ViewRecord() 
{ 
    if (MyClass.SessionName == null) 
    { 
     return View("Home"); 
    } 
    else 
    { 
     //do something with the session variable 
    } 
} 

有沒有其他辦法可以做到這一點? 在這種情況下最佳做法是什麼?

+1

你需要一個自定義操作過濾器,一些更多的信息的http:// MSDN .microsoft.com/zh-cn/gg618482 – 2012-04-10 14:49:00

+0

此處的類似討論:http://forums.asp.net/t/1287687.aspx – 2012-04-10 14:49:44

+0

除了@ ChrisDiver的評論,如果您需要將它應用於所有控制器/操作,你可以裝飾一個基地控制器,從其中你所有的其他控制器繼承。 – Chris 2012-04-10 15:03:10

回答

0

首先,你應該重定向到首頁,而不是返回主頁視圖,否則你有主頁顯示的奇怪的情況,儘管Url在別的地方。

其次,會話永遠不會爲空,因爲當舊會話過期或重置時會創建新會話。你會改爲檢查你的變量,如果THAT爲空,那麼你知道會話是新的。

第三,如果你的應用依賴於這個會話數據,那麼我根本不會使用會話。你用這個來緩存數據嗎?如果是這樣,那麼使用緩存可能是一個更好的選擇(當緩存項目到期時,您的應用會得到通知)。

不幸的是,這可能是The XY Problem的一種情況。您有問題,並且您認爲會話解決了您的問題,但是您遇到了與會話不同的問題,因此您正在問如何解決會話問題,而不是如何解決會話嘗試解決的問題。

你試圖用這個解決的實際問題是什麼?

編輯:

根據您在下面的評論,你爲什麼不通過URL傳遞客戶編號:

http://website/Controller/ViewRecord/3 

public ActionResult ViewRecord(int id) 
{ 
    // do whatever you need to do with the customer ID 
} 
+0

Web應用程序允許搜索客戶。我們根據他們的ID號選擇一個客戶。我正在設置該ID號碼有一個會話。這裏是我做的:'\t \t公共靜態字符串CIF \t \t { \t \t \t得到 \t \t \t { \t \t \t \t如果(HttpContext.Current.Session [ 「到岸價格」] == NULL) \t \t \t \t \t return「」; 。 \t \t \t \t別的 \t \t \t \t \t返回HttpContext.Current.Session [ 「CIF」]的ToString(); \t \t \t} \t \t \t集合{HttpContext.Current.Session [ 「CIF」] =值; } \t \t} - 然後在View上,我調用MyClass.CIF來獲取Session的值。 – Turp 2012-04-10 18:01:06

+0

@Turp - 您爲什麼需要將客戶添加到會話中?爲什麼不在網址中傳遞客戶號碼?然後,該值不會存儲在會話中,並且在您不再需要時會消失。 – 2012-04-10 18:04:12

+0

我們真的沒有什麼實際的原因,除了這是在我的原始版本的Web應用程序之前完成的。你的意思是否符合'/ Customer/Edit/1234'的意思?我們曾經討論過,它看起來不如'/ CustomerProfile/Edit'好,另一件事就是我們不希望我們的用戶用一個隨機數替換當前的數字來拉另一個的客戶。 BTY,這只是一個內部的Web應用程序。你站在哪裏? – Turp 2012-04-10 18:15:43

3

如果它是在一個控制器,你可以這樣做:

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    base.OnActionExecuting(filterContext); 
    ... // do your magic 
} 

這將觸發之前的任何動作執行。你不能從那裏返回一個視圖,雖然,你必須重定向到任何東西,返回作用的結果,如:

filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "Shared" }, { "action", "Home" } }); 

但是,很明顯,這應該重定向到不是受控制器的動作覆蓋,否則你有一個循環重定向。 :)