Làm cách nào để chuyển hướng từ OnActionExecuting trong Base Controller?


183

Tôi đã thử hai cách: Feedback.Redirect () mà không làm gì, cũng như gọi một phương thức mới bên trong Bộ điều khiển cơ sở trả về ActionResult và nó trả về RedirectToAction () ... cả hai đều không hoạt động.

Làm cách nào tôi có thể thực hiện chuyển hướng từ phương thức OnActionExecuting?

Câu trả lời:


362
 public override void OnActionExecuting(ActionExecutingContext filterContext)
 {
    ...
    if (needToRedirect)
    {
       ...
       filterContext.Result = new RedirectResult(url);
       return;
    }
    ...
 }

79
Thay vì new RedirectResult(url)bạn cũng có thể sử dụng new RedirectToAction(string action, string controller). Điều này có thể đã được thêm vào MVC sau khi bạn đăng câu trả lời của mình. Giải pháp của bạn đưa tôi đi đúng hướng nào.
Manfred

3
@Pluc - OnActionExecuting xảy ra đầu tiên. Nếu bạn đặt bối cảnh.Result, thì chuyển hướng sẽ xảy ra trước khi hành động thực thi. (Được xác minh bằng thử nghiệm / gỡ lỗi cá nhân.)
James

39
@Manfred Lưu ý, bài tập nên được thực hiện theo phương thức (không có new) RedirectToAction:filterContext.Result = RedirectToAction(string action, string controller);
cederlof

1
@Manfred Tôi chỉ muốn thêm rằng bạn sẽ không mới RedirectToAction. Đó chỉ là bộ lọcContext.Result = RedirectToAction (..)
Trang web thẩm mỹ 28/03/2016

4
Tên 'RedirectToAction' không tồn tại trong bối cảnh hiện tại ??
Dan Hastings

55

Nó cũng có thể được thực hiện theo cách này:

filterContext.Result = new RedirectToRouteResult(
    new RouteValueDictionary
    {
        {"controller", "Home"},
        {"action", "Index"}
    }
);

35

Tạo một lớp riêng biệt,

    public class RedirectingAction : ActionFilterAttribute
    {
      public override void OnActionExecuting(ActionExecutingContext context)
      {
        base.OnActionExecuting(context);

        if (CheckUrCondition)
        {
            context.Result = new RedirectToRouteResult(new RouteValueDictionary(new
            {
                controller = "Home",
                action = "Index"
            }));
        }
      }
   }

Sau đó, khi bạn tạo một bộ điều khiển, hãy gọi chú thích này là

[RedirectingAction]
public class TestController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

Tôi thích đối tượng ẩn danhRouteValueDictionary này cho hàm tạo vì nó phản chiếu định tuyến ở nơi khác trong MVC. +1
Mã hóa

3

Nếu bộ điều khiển chuyển hướng kế thừa từ cùng một baseControllernơi chúng ta ghi đè OnActionExecutingphương thức gây ra vòng lặp đệ quy. Giả sử chúng ta chuyển hướng nó sang hành động đăng nhập của bộ điều khiển tài khoản, thì hành động đăng nhập sẽ gọi OnActionExecutingphương thức và chuyển hướng đến cùng một hành động đăng nhập ... Vì vậy, chúng ta nên áp dụng OnActionExecutingphương thức kiểm tra để kiểm tra thời tiết yêu cầu từ cùng một bộ điều khiển nếu vì vậy sau đó không chuyển hướng hành động đăng nhập lại. đây là mã:

ghi đè được bảo vệ.

void OnActionExecuting(ActionExecutingContext filterContext)
{
   try
   {
      some condition ...
   }
   catch
   {
      if (filterContext.Controller.GetType() !=     typeof(AccountController))
      {
         filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "Account" }, { "action", "Login" } });
      }
   }
}

1
thử {int CompanyId = UserContext.Company.CompanyId; } bắt {if (bộ lọc ); }}
abdul xấu hổ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.