2010-04-02 23 views
7

Xem xét ứng dụng ASP.NET MVC yêu cầu phải đặt biến phiên. Nó được sử dụng trong suốt ứng dụng. Nó sẽ được đặt bằng cách đọc giá trị băm trên cookie của trình duyệt hoặc sau khi có thông tin đăng nhập của người dùng.ASP.NET MVC: đảm bảo người dùng luôn có bộ biến phiên

Trong mô hình WebForms + Master Page, tôi sẽ kiểm tra Page_Load() của trang chính. Có lẽ không phải là sự kiện tối thượng, nhưng đó là một sự kiện dễ tìm.

Làm cách nào bạn kiểm tra và thực thi sự tồn tại của biến phiên trong ASP.NET MVC? Hãy xem xét rằng câu hỏi này có thể không liên quan đến chi tiết đăng nhập của người dùng, nhưng một số dữ liệu khác (lần truy cập đầu tiên, có lẽ).

Giải pháp nỗ lực

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

bạn đã thử sử dụng 'Application_PreRequestHandlerExecute'? – Kiquenet

Trả lời

10

Bạn có hai lựa chọn.

1.Place logic trong Initialize chức năng điều khiển cơ sở của

Giả sử rằng tất cả các bộ điều khiển của bạn kế thừa từ một bộ điều khiển cơ bản, bạn có thể đặt logic cần thiết trong override của Execute() chức năng của bộ điều khiển cơ sở.

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. Sử dụng Global.asax void Application_PreRequestHandlerExecute(Object source, EventArgs e) chức năng

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 
    } 
} 

Lưu ý: Phần thứ hai làm việc với bất kỳ ứng dụng ASP.NET, WebForms hoặc MVC.

Đối với enforcing rằng chúng có một biến phiên nhất định, nó thực sự rất cởi mở. Bạn có thể chuyển hướng đến một trang nhất định để họ điền vào biểu mẫu hoặc chọn một tùy chọn hoặc một thứ gì đó. Hoặc có thể chỉ có một giá trị mặc định được đặt thành một khóa phiên nhất định nếu nó không được tìm thấy.

EDIT

Trong khi chơi với điều này, tôi nhận thấy một vấn đề lớn với Application_PreRequestHandlerExecute cách tiếp cận. Trình xử lý sự kiện đang được gọi cho mọi yêu cầu được thực hiện cho máy chủ, có thể là tệp .css/.js/.html. Tôi không chắc đây có phải là vấn đề với cách mà máy trạm của tôi được cài đặt hay chỉ là cách ASP.NET/IIS hoạt động, vì vậy tôi sẽ đảm bảo rằng điều này không được gọi trên tất cả các yêu cầu khi thực hiện phương pháp trên.

Đó là vì những lý do trước đây tôi đã hoàn thành công việc được thực hiện trong phiên với tuyên bố if.

+0

@Baddie - cảm ơn các đề xuất! Thật không may là kết quả tùy chọn thứ 2 trong 'tham chiếu đối tượng không được đặt'. Tôi đã cập nhật câu hỏi với chi tiết. Cảm ơn một lần nữa! –

+0

Đã cập nhật câu trả lời của tôi. Bạn cần sử dụng sự kiện 'Application_PreRequestHandlerExecute' thay vì' Application_BeginRequest' như 'Session' không được xây dựng ở đó. Hãy xem bản chỉnh sửa của tôi. – Omar

+0

@Omar Điều này đã giúp tôi, tùy chọn 1. Cần kiểm tra vai trò của người dùng đối với trạng thái quản trị viên và lưu trữ yay hoặc phiên này trong phiên trước khi mỗi hành động thực thi. Cảm ơn. – webtrifusion

2

Không chắc chắn tôi hoàn toàn hiểu được câu hỏi, nhưng tôi làm điều này bằng cách ghi đè lên phương pháp OnActionExecuting của bộ điều khiển.

Trong đó, bạn thực hiện mã để xem Biến phiên có tồn tại hay không. Nếu không, hãy tạo nó, nếu sau đó sử dụng nó.

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

Một cách khác, lớp ControllerActionInvoker gọi mọi phương thức hành động; nó được gán cho bộ điều khiển thông qua nhà máy điều khiển. Vì vậy, bạn có thể phân lớp người gọi hành động này, mỗi khi một hành động được gọi (bằng cách overridding phương thức InvokeAction) kiểm tra ở đây cho sự tồn tại này ...

Các vấn đề liên quan