2012-03-01 14 views
43

Trong WebForm, chúng ta có thể viết một phương thức trong MasterPage.cs và nó chạy trong mỗi yêu cầu.
ví dụ:Chạy một phương thức trong mỗi yêu cầu trong MVC, C#?

MasterPage.cs 
-------------- 
protected void Page_Load(object sender, EventArgs e) 
{ 
    CheckCookie(); 
} 

Làm thế nào chúng ta có thể làm điều gì đó như thế này trong MVC?

+1

có lẽ đây http://stackoverflow.com/questions/2650269/how-do-i-get-certain-code-to-execute-before- mỗi đơn điều khiển-hành động-trong-như – V4Vendetta

+1

Bạn muốn đặt một ActionFilterAttribute trên bộ điều khiển –

+0

Tôi sẽ als o nhìn vào những gì phương pháp đang làm và nếu nó vẫn còn cần thiết trong MVC, không có điểm chuyển một cái gì đó mà công nghệ mới làm cho lỗi thời. – TheRealTy

Trả lời

80

Trong ASP.NET MVC bạn có thể viết một custom global action filter.


UPDATE:

Theo yêu cầu trong phần ý kiến ​​dưới đây là một ví dụ về bộ lọc như vậy có thể trông như thế nào như:

public class MyActionFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var fooCookie = filterContext.HttpContext.Request.Cookies["foo"]; 
     // TODO: do something with the foo cookie 
    } 
} 

Nếu bạn muốn thực hiện ủy quyền dựa trên giá trị của cookie , sẽ chính xác hơn khi triển khai giao diện IAuthorizationFilter:

public class MyActionFilterAttribute : FilterAttribute, IAuthorizationFilter 
{ 
    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     var fooCookie = filterContext.HttpContext.Request.Cookies["foo"]; 

     if (fooCookie == null || fooCookie.Value != "foo bar") 
     { 
      filterContext.Result = new HttpUnauthorizedResult(); 
     } 
    } 
} 

Nếu bạn muốn lọc hành động này để chạy trên mỗi yêu cầu cho mỗi hành động điều khiển bạn có thể đăng ký nó như một bộ lọc hành động toàn cầu trong global.asax của bạn trong phương pháp RegisterGlobalFilters:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new HandleErrorAttribute()); 
    filters.Add(new MyActionFilterAttribute()); 
} 

Và nếu bạn cần điều này để chỉ thực hiện cho hành động hoặc điều khiển đặc biệt chỉ đơn giản là trang trí chúng với thuộc tính này:

[MyActionFilter] 
public ActionResult SomeAction() 
{ 
    ... 
} 
+0

Bạn có thể viết mẫu cho nó không? –

+0

@Mohammad, chắc chắn, tôi nghĩ bạn đã đọc bài viết mà tôi đã liên kết trong câu trả lời của tôi và cố gắng triển khai mã mẫu được hiển thị ở đó. Rõ ràng tôi đã sai khi nghĩ về điều này. Vì vậy, tôi đã cập nhật câu trả lời của mình để hiển thị ví dụ. –

+0

Cảm ơn anh bạn, nhưng là một câu hỏi. làm thế nào chúng ta có thể chuyển hướng đến một hành động trong 'MyActionFilterAttribute'? –

6

Bạn có thể sử dụng Global.asax Application_AcquireRequestState phương pháp mà sẽ được kêu gọi mọi yêu cầu:

protected void Application_AcquireRequestState(object sender, EventArgs e) 
{ 
    //... 
} 
+2

Vì vậy, chúng ta có thể truy cập vào Cookie và Session từ phương thức trên không? –

+1

Có thể. nhưng phương pháp này có thể được thực thi nhiều hơn một lần theo yêu cầu –

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