2012-04-10 29 views
6

Tôi có một biến phiên được đặt trong ứng dụng MVC của mình. Bất cứ khi nào phiên đó hết hạn và người dùng cố gắng làm mới trang mà họ đang truy cập, trang sẽ ném một lỗi vì phiên không được đặt nữa.MVC Tương đương với Page_Load

Có nơi nào tôi có thể kiểm tra xem phiên được đặt trước khi tải chế độ xem không? Có lẽ đặt một cái gì đó bên trong tập tin Global.asax?

Tôi có thể làm điều gì đó như thế này vào đầu EVERY ActionResult.

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

Có cách nào khác để thực hiện việc này không? Thực hành tốt nhất trong trường hợp này là gì?

+1

Bạn cần một bộ lọc hành động tùy chỉnh, một số biết thêm http: // MSDN .microsoft.com/en-us/gg618482 –

+0

Thảo luận tương tự tại đây: http://forums.asp.net/t/1287687.aspx –

+0

Ngoài nhận xét của @ ChrisDiver, nếu bạn cần nó áp dụng cho tất cả các bộ điều khiển/hành động của bạn , bạn có thể trang trí bộ điều khiển cơ sở mà tất cả các bộ điều khiển khác của bạn kế thừa. – Chris

Trả lời

0

Trước tiên, bạn nên chuyển hướng đến Trang chủ, không trả về Chế độ xem trang chủ, nếu không bạn có tình huống kỳ lạ của trang chủ hiển thị mặc dù Url đang ở một nơi khác.

Thứ hai, Phiên sẽ không bao giờ là Null, vì phiên mới sẽ được tạo khi phiên cũ hết hạn hoặc được đặt lại. Thay vào đó, bạn sẽ kiểm tra biến của mình và nếu THAT là null, thì bạn biết phiên là mới.

Thứ ba, Nếu ứng dụng của bạn phụ thuộc vào dữ liệu phiên này, thì tôi sẽ không sử dụng phiên nào cả. Bạn đang sử dụng dữ liệu này để lưu vào bộ nhớ cache? Nếu vậy, sau đó sử dụng Cache có thể là lựa chọn tốt hơn (ứng dụng của bạn được thông báo khi các mục trong bộ nhớ cache hết hạn).

Rất tiếc, đây có thể là trường hợp The XY Problem. Bạn có một vấn đề, và bạn tin rằng Session giải quyết vấn đề của bạn, nhưng bạn đang gặp phải một vấn đề khác với Session, vì vậy bạn đang hỏi cách giải quyết vấn đề phiên của bạn hơn là cách giải quyết vấn đề mà Session đang cố gắng giải quyết.

Vấn đề thực sự bạn đang cố gắng giải quyết vấn đề này là gì?

EDIT:

Dựa trên nhận xét của bạn bên dưới, tại sao bạn không vượt qua số khách hàng trên url:

http://website/Controller/ViewRecord/3 

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

Ứng dụng web cho phép tìm kiếm khách hàng. Chúng tôi chọn một khách hàng dựa trên Số ID của họ. Tôi đang thiết lập Mã số đó có một phiên.Đây là nơi tôi làm điều đó tại: '\t \t public static string CIF \t \t { \t \t \t được \t \t \t { \t \t \t \t if (HttpContext.Current.Session [ "CIF"] == null) \t \t \t \t \t trả về ""; . \t \t \t \t khác \t \t \t \t \t trở HttpContext.Current.Session [ "CIF"] ToString(); \t \t \t} \t \t \t đặt {HttpContext.Current.Session ["CIF"] = value; } \t \t} '- Sau đó trên Chế độ xem, tôi đang gọi MyClass.CIF để nhận giá trị của Phiên. – Turp

+0

@Turp - Tại sao bạn cần thêm khách hàng vào phiên? Tại sao không chỉ chuyển số khách hàng trong URL? Sau đó, giá trị không được lưu trữ trong phiên và nó biến mất khi bạn không cần nó nữa. –

+0

Chúng tôi thực sự không có lý do thực sự, ngoại trừ đó là cách nó được thực hiện trước tôi trong phiên bản gốc của ứng dụng web. Bạn có nghĩa là một cái gì đó dọc theo dòng của '/ Khách hàng/Chỉnh sửa/1234'? Chúng tôi đã thảo luận rằng nó không giống * tốt như '/ CustomerProfile/Edit' và một thứ khác được đưa ra là chúng tôi không muốn người dùng thay thế số hiện tại bằng một số ngẫu nhiên để kéo lên một số khác của khách hàng. BTY, đây chỉ là một ứng dụng web nội bộ. Nơi nào bạn đứng về điều này? – Turp

3

Nếu đó là trong một bộ điều khiển, bạn có thể làm điều này:

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

Nó sẽ kích hoạt trước trên bất kỳ thực hiện hành động. Bạn không thể trở về một cái nhìn từ đó, mặc dù bạn sẽ phải chuyển hướng đến bất cứ điều gì mà trả về kết quả hoạt động, ví dụ:

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

Nhưng, rõ ràng, mà phải chuyển hướng đến hành động trong bộ điều khiển mà không bị ảnh hưởng bởi ghi đè, nếu không bạn có chuyển hướng vòng tròn. :)