2012-03-23 25 views

Trả lời

18

Bạn có thể sử dụng filterContext.Result cho việc này. Nó sẽ giống như sau:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    //Check your condition here 
    if (true) 
    { 
     //Create your result 
     filterContext.Result = new EmptyResult(); 
    } 
    else 
     base.OnActionExecuting(filterContext); 
} 
+0

Tại sao bạn bỏ qua base.OnActionExecuting khi điều kiện của bạn là đúng? Trong trường hợp của tôi, tôi cần điều đó để chạy trước khi tôi có thể thiết lập kết quả. – xr280xr

33

Xem mẫu tải xuống và bài viết MSDN Filtering in ASP.NET MVC của tôi.

Bạn có thể hủy thực thi bộ lọc trong các phương pháp OnActionExecutingOnResultExecuting bằng cách đặt thuộc tính Result thành giá trị không null.

Bất kỳ bộ lọc nào đang chờ xử lý OnActionExecutedOnActionExecuting sẽ không được gọi và người gọi sẽ không gọi phương thức OnActionExecuted cho bộ lọc bị hủy hoặc cho bộ lọc đang chờ xử lý.

Bộ lọc OnActionExecuted cho các bộ lọc trước đó sẽ chạy. Tất cả các bộ lọc OnResultExecutingandOnResultExecuted sẽ chạy.

Các mã sau đây từ mẫu cho thấy làm thế nào để trả về một cụ ActionResult khi một điều kiện nhất định được đáp ứng trong OnActionExecuting:

if (filterContext.RouteData.Values.ContainsValue("Cancel")) 
{ 
    filterContext.Result = new RedirectResult("~/Home/Index"); 
    Trace.WriteLine(" Redirecting from Simple filter to /Home/Index"); 
} 
+2

Cần lưu ý rằng nếu bạn có nhiều bộ lọc và thứ tự bộ lọc quan trọng, bạn nên chỉ định tham số "Đặt hàng" khi đăng ký bộ lọc để bạn có thể kiểm soát thứ tự thực hiện khi Rick đã nêu chi tiết về kết quả filterContext.Result thuộc tính hoạt động. –

+0

Nick điểm tốt - nhưng xem phần Bộ lọc thứ tự của tôi - thuộc tính thứ tự chỉ áp dụng cho các bộ lọc trong cùng một lớp. Auth luôn chạy đầu tiên, ngoại lệ, cuối cùng. – RickAndMSFT

3

Bạn có thể sử dụng đoạn mã sau đây.

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    ... 
    if (needToRedirect) //your condition here 
    { 
     ... 
     filterContext.Result = new RedirectToAction(string action, string controller) 
     return; 
    } 
    ... 
} 

RedirectToAction sẽ chuyển hướng bạn hành động cụ thể dựa trên điều kiện.

+0

RedirectToAction là một phương thức (ít nhất là trong MVC5), do đó bạn không thể new() nó. – rumblefx0

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