2009-03-16 22 views

Trả lời

9

Có, bạn có thể làm điều này nhưng nó không phải là cách nó hoạt động ra khỏi hộp. Tôi đã điều sau đây:

  1. Tạo một lớp điều khiển cơ bản và có tất cả các bộ điều khiển của bạn kế thừa từ nó
  2. Tạo một thuộc tính lọc hành động và có nó kế thừa từ FilterAttribute và IActionFilter
  3. Trang trí lớp điều khiển cơ sở của bạn với mới lọc hành động thuộc tính của bạn

Dưới đây là một ví dụ về các thuộc tính lọc hành động:

public class SetCultureAttribute : FilterAttribute, IActionFilter 
{ 
    #region IActionFilter implementation 

    public void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     //logic goes here 
    } 

    public void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     //or logic goes here 
    } 

    #endregion IActionFilter implementation 
} 

Dưới đây là một mẫu của các lớp điều khiển cơ bản với thuộc tính này:

[SetCulture] 
public class ControllerBase : Controller 
{ 
    ... 
} 

Sử dụng phương pháp này càng lâu càng lớp điều khiển của bạn được thừa hưởng từ ControllerBase sau đó lọc hành động SetCulture sẽ luôn luôn được thực thi. Tôi có một mẫu đầy đủ và đăng trên on my blog nếu bạn muốn biết thêm chi tiết.

Hy vọng điều đó sẽ hữu ích!

+0

Điều này chỉ ảnh hưởng đến ActionResults? Hay nó cũng ảnh hưởng đến các loại kết quả khác? JsonResult, FileResult, v.v ...? –

0

Bạn không phải áp dụng nó cho mọi hành động, bạn chỉ có thể áp dụng nó cho mọi bộ điều khiển (ví dụ: đặt thuộc tính vào lớp, không phải phương thức).

Hoặc, như Ian đã đề cập, bạn có thể đặt nó trên một lớp bộ điều khiển cơ sở và sau đó mở rộng từ bộ điều khiển đó.

4

Làm thế nào mọi thứ trở nên tốt hơn ... 2 năm sau chúng tôi có

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorElmahAttribute()); 
    } 
+0

basallo - bạn sẽ gọi từ đâu? hoặc đặt nó? –

+0

Trong global.asax. –

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