2012-01-03 34 views
9

Tôi có yêu cầu sau đây:Thực thi mã trước khi bất kỳ hành động

Trên mỗi yêu cầu đến trang web của tôi, bất kể là hành động người dùng đang cố gắng để gọi, tôi cần phải gọi một số mã để kiểm tra nếu tài nguyên là trong địa điểm. Nếu có, thì mọi thứ đều ổn và phương thức hành động nên được gọi là bình thường.

Tuy nhiên, nếu tài nguyên này không có sẵn, tôi muốn tất cả yêu cầu trả lại một trang riêng yêu cầu người dùng chọn một tài nguyên khác từ danh sách tài nguyên có sẵn.

Vì vậy, có thể có một phương pháp chạy trước bất kỳ phương pháp hành động nào có tùy chọn hủy cuộc gọi đến phương thức hành động và thực hiện một thao tác khác thay thế?

+0

Bạn có thể triển khai HttpModule của riêng mình hoặc có thể đặt séc của bạn trong 'Application_BeginRequest()' bên trong global.asax.cs – rejj

Trả lời

16

Nhìn vào bộ lọc hành động toàn cầu (có sẵn từ asp.net MVC 3): http://msdn.microsoft.com/en-us/library/gg416513%28v=vs.98%29.aspx

Về cơ bản, trong Global.asax của bạn, bạn có thể đăng ký các bộ lọc trên toàn cầu trong quá trình startup ứng dụng của bạn (trong Application_Start()) với:

GlobalFilters.Filters.Add(new MyActionFilterAttribute()); 

sau đó bạn có thể ghi đè lên các phương pháp OnActionExecuting, và thiết lập thuộc tính Kết quả với một RedirectToRouteResult.

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    if (IsMyResourceAvailable()) 
    { 
     filterContext.Result = new RedirectToRouteResult(
      new RouteValueDictionary { 
       { "Controller", "YourControllerName" }, 
       { "Action", "YourAction" } 
      }); 
    } 

    base.OnActionExecuting(filterContext); 
} 
5

MVC cung cấp một số móc để thực hiện việc này.

Trong bộ điều khiển cơ sở, bạn có thể ghi đè Controller.OnActionExecuting(context) sẽ kích hoạt ngay trước khi thực thi hành động. Bạn có thể đặt context.Result cho bất kỳ ActionResult nào (chẳng hạn như RedirectToAction) để ghi đè hành động.

Hoặc, bạn có thể tạo ActionFilterAttribute và chính xác như trên, bạn ghi đè phương thức OnActionExecuting. Sau đó, bạn chỉ cần áp dụng thuộc tính cho bất kỳ bộ điều khiển nào cần nó.

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