2013-08-23 33 views
8

Tôi gặp sự cố với ActionFilterAttriute không chuyển hướng chính xác. Tôi không quen thuộc với các codebase hoàn chỉnh, nhưng tôi đã thấy đủ để không hiểu những gì đang xảy ra.ActionFilterAttribute không chuyển hướng

Để simplyfy mã, tôi đã gỡ bỏ những phần không liên quan:

public class ResolveApplicationRedirectAttribute : ActionFilterAttribute 
{ 
    //some variables 
    private ActionExecutingContext _filterContext; 

    protected string ApplicationRedirectUrl 
    { 
     get { return ConfigurationManager.AppSettings["ApplicationRedirectUrl"]; } 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     _filterContext = filterContext; 

     //a lot of logic that decide if we should redirect or not 

     //I added this after the other logic to make it always redirect regardless of what happens inside the logic above 
     _filterContext.Result = new RedirectResult(ApplicationRedirectResult); 
    } 
} 

[ResolveApplicationRedirect] 
public ActionResult Index(CrmQueryStringParameters crmParameters){ 
    //some logic 
} 

này thường làm việc, nhưng khi ứng dụng bị ảnh hưởng bởi một vài yêu cầu trong một khoảng thời gian ngắn, phương pháp Index kết thúc lên được được gọi và thổi lên vì Chế độ xem thiếu một số dữ liệu (chúng tôi biết dữ liệu bị thiếu. Đó là lý do chúng tôi muốn chuyển hướng).

Nhưng bây giờ khi tôi đã thêm _filterContext.Result = new RedirectResult(ApplicationRedirectResult) làm dòng cuối cùng của phương thức OnActionExecuting, làm cách nào để nó vẫn gọi phương thức Hành động của tôi?

Có bất kỳ lỗi nào/trường hợp góc/bất kỳ thứ gì khác có thể khiến MVC bỏ qua RedirectResult Tôi đã đưa vào filterContext và kích hoạt phương thức hành động không?

Bất kỳ điều gì đặc biệt có thể nằm trong logic của OnActionExecuting có thể gây ra sự cố ngay cả khi tôi đặt filterContext.Result làm dòng cuối cùng. Bất kỳ ngoại lệ nào bên trong thuộc tính chỉ cần thổi nó lên, và không bỏ qua thuộc tính và gọi phương thức Action.

Bất kỳ trợ giúp nào để chỉ cho tôi đúng hướng sẽ được đánh giá cao tại đây.

+0

Nếu bạn nhìn vào mã nguồn cho MVC, bạn sẽ thấy một phương thức InvokeActionMethodFilter thực hiện OnActionExecuting trên bộ lọc của bạn thông qua ActionExecutingContext. Nếu nó trả về với một giá trị kết quả không null, nó trả về một hành động bỏ qua ActionExecutedContext gọi hành động của bạn. Vì vậy, theo cách mà bạn đang thấy không nên có thể. Vì vậy, vấn đề duy nhất có thể là một giá trị null cho kết quả. Nếu bạn bình luận tất cả các logic của bạn và chỉ giữ dòng cuối cùng, là chuyển hướng của bạn làm việc sau đó? –

Trả lời

0

Tôi đã tìm thấy sự cố cuối cùng. Nó liên quan đến việc sử dụng biến lớp _filterContext.

Vấn đề là MVC không tạo một phiên bản mới của bộ lọc cho mỗi yêu cầu, khiến một số yêu cầu chia sẻ cùng một phiên bản thuộc tính.

Để biết thêm chi tiết, hãy xem danh sách các thay đổi đột phá in the MVC3 release notes.

0

+1 cho kết quả của Wouter. Với mã bạn đã hiển thị, bạn không thể đạt được kết quả mà bạn mô tả. Có lẽ số // magic logic here đang trả về một số trống _filterContext.Result?

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