2011-06-28 37 views
14

Hi I `m cố gắng để làm một cái gì đó có vẻ kinda dễ dàng, và được ghi lại theo cách đó, nhưng đối với một số lý do nó không đi mà dễ dàng.Tùy chỉnh ASP.NET MVC ActionFilterAttribute - móc không bao giờ được gọi là

basiclly tôi đã viết một cái gì đó như thế này:

public class CacheControllAttribute : ActionFilterAttribute 
{ 
    public override void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
     //do something 
     base.OnResultExecuting(filterContext); 
    } 
} 

Tuy nhiên khi tôi cố gắng và sử dụng này vào một kết quả hành động như thế này:

[CacheControllAttribute] 
public ActionResult SomeAction() 
{ 
    //whatever 
} 

tùy chỉnh chức năng My overriden không bao giờ được gọi ...

bất kỳ ý tưởng nào về điều này? hoặc làm thế nào để thực hiện điều này một cách khác nhau?

+0

Có vẻ như ổn. Bạn đang sử dụng phiên bản MVC nào? – LeftyX

+0

Đây là MVC 2, tôi bắt đầu nghĩ rằng có thể một cái gì đó khác là ngăn chặn các bộ lọc từ executions hoặc một cái gì đó như thế, điều này có thể được theo dõi như toàn bộ dòng chảy thực hiện bằng cách nào đó? – aromasca

+0

Tôi đã có chính xác cùng một vấn đề. Ngay cả khi tôi đã thêm bộ lọc trong globalFilterCollection, tôi đã nhận được lỗi rằng tôi nên triển khai IActionFilter. Sau một thời gian tôi phát hiện ra rằng tôi đã sử dụng System.Web. ** Http.Filters **. IActionFilter và System.Web. ** Http.Filters **. ActionFilterAttribute thay vì System.Web chính xác. ** Mvc * * .IActionFilter và System.Web ** Mvc **. ActionFilterAttribute Mayby rằng nó sẽ giúp ai đó. –

Trả lời

4

Cuối cùng đã tìm ra, đó là vào cuối thực tế là tôi đã được đặt bộ lọc trên một chức năng mà trong thực tế là một chức năng ActionResult, nhưng nó được trả về bởi một phương thức khác gọi là nó, vì vậy các bộ lọc chỉ được thực thi một lần trên Action point entry.

0

Ý tưởng:

Bạn có dương tính lọc của bạn không chạy? Bạn đã đặt một điểm break trong nó? Bạn có chắc chắn nó không phải là ném và ngoại lệ? Bạn có chắc chắn hành động bạn trang trí thực sự được gọi là gettting?

thực hiện khác nhau:

Override các OnResultExecuting phương pháp điều khiển của bạn.

+0

Có những gì tôi thực sự làm là có một breakpoint trên cả hai chức năng ActionResult của tôi và trên bộ lọc tùy chỉnh của tôi, trình gỡ lỗi chỉ có thể đạt đến điểm ngắt trên chức năng ActionResult tuy nhiên – aromasca

1

Các bạn đã thử cách ghi đè các OnActionExecuting như:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    base.OnActionExecuting(filterContext); 
} 

Đây là cách tôi viết lọc hành động và đã không có một vấn đề với họ được gọi.

+0

Đã cố gắng ghi đè hành động thực hiện thay vì dường như không làm cho bất kỳ sự khác biệt .. nó vẫn không được gọi là Có thể có bất kỳ cấu hình nào khác được yêu cầu như trong web.config hay bất kỳ thứ gì như thế không? – aromasca

+0

@aromasca - Không yêu cầu mục nhập web.config. Bạn có chắc chắn hành động của bạn đang được gọi? Bạn đã đặt điểm ngắt trong bộ lọc của mình để xem liệu điểm đó có bị tấn công không? – amurra

1

Mã của bạn thường có vẻ tốt với tôi. Nó có thể liên quan đến những gì bạn đang làm (hoặc không làm) trong phương thức Hành động của bạn. Nếu bạn không trả lại chế độ xem, v.v., có thể trình xử lý sự kiện "ResultExecuting" của bạn không được gọi. Tôi sẽ lấy mẫu here và xem những gì được ghi lại cho hành động của bạn.

23

Đề xuất có thể ngớ ngẩn nhưng bạn đã thêm đề xuất đó vào số global.asax?
Đây là một ví dụ từ một trong những ứng dụng của tôi:

public class MvcApplication : System.Web.HttpApplication  
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
    filters.Add(new LogonAuthorize()); 
    filters.Add(new HandleErrorAttribute()); 
    } 
} 
+1

Sau hai giờ muốn bash máy tính của tôi ... đây là tất cả ... – Kyle

16

lỗi của tôi là tôi tham chiếu System.Web.Http.Filters, không System.Web.Mvc

+4

Cảm ơn bạn rất nhiều Yara. Tôi cũng đã phạm sai lầm tương tự và tôi đã học được từ bình luận của bạn. Do đó một cuộc bỏ phiếu cho bạn. :-) –

+1

Dường như là người chia sẻ tài liệu tham khảo đầu tiên đi theo số – Hoody

+1

cùng một vấn đề ở đây! cảm ơn vì tiền hỗ trợ. Đã xảy ra lỗi bởi Resharper – Korayem

0

Nếu bạn thấy thừa kế của lớp 'ActionFilterAttribute' mà thừa hưởng "FilterAttribute, IActionFilter, IResultFilter" lớp. Phương pháp bạn đang tìm kiếm có sẵn trong giao diện IResultFilter.

Do đó, nó không bao giờ thực thi phương thức khi chúng tôi sử dụng lớp tùy chỉnh làm thuộc tính. Chúng tôi luôn luôn cần ghi đè tất cả các phương pháp IActionFilterIResultFilter trong điều khoản để triển khai tùy chỉnh.

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