asp .net mvc OnResultВыполняет изменение filterContext Result - PullRequest
6 голосов
/ 20 мая 2009

Простой вопрос. Как мне переопределить метод OnResultExecuting в моем контроллере и заставить вместо него другой ActionResult?

Пример кода приведен ниже. В настоящее время оригинальный ActionResutl продолжает выполняться, а мой новый RedirectResult игнорируется.

RedirectResult redirectResult = new RedirectResult("http://www.google.com");
filterContext.Result = redirectResult;
base.OnResultExecuting(filterContext);

Ответы [ 4 ]

9 голосов
/ 20 мая 2009

Это будет возможно, если вы переопределите метод OnActionExecuted.

Пример:

protected override void OnActionExecuted(ActionExecutedContext filterContext)
  {
      filterContext.Result = new RedirectResult("http://google.com");
      base.OnActionExecuted(filterContext);
  }
6 голосов
/ 09 апреля 2014

Я хотел знать точно то же самое. Я искал в Google и наткнулся на ваш вопрос, а также на другие, и ответы кажутся одинаковыми. Используйте метод IActionFilter.OnActionExecuted.

Однако на самом деле это не ответ, а скорее обходной путь, поскольку @ randy-load предлагает изменить / заменить результат действия RedirectToRouteResult в фильтре результатов. Так почему бы не результат действия RedirectRoute?

Если вы действительно хотите перенаправить на определенный URL-адрес в методе IResultFilter.OnResultExecuting, то вы можете выполнить одно из следующих действий:

RedirectResult redirectResult = new RedirectResult("http://www.google.com");
filterContext.Result = redirectResult;
filterContext.Result.ExecuteResult(filterContext.Controller.ControllerContext);
filterContext.Cancel = true;
base.OnResultExecuting(filterContext);

Или

filterContext.HttpContext.Response.RedirectLocation = "http://www.google.com";
filterContext.HttpContext.Response.StatusCode = 302;
filterContext.Cancel = true;
base.OnResultExecuting(filterContext);

В первом варианте вы вручную выполняете RedirectResult и, выполняя filterContext.Cancel = true, вы сообщаете фреймворку, что вам не требуется запуск filterContext.Result. Во втором варианте вы, по сути, делаете то же самое, но вместо того, чтобы RedirectResult настраивал Http-ответ, вы делаете это самостоятельно.

В моем случае я хотел добавить дополнительный параметр запроса к URL-адресу перенаправления и сказать платформе, что хотел отменить результат действия перенаправления, а затем перенаправить в любом случае, казалось немного неправильным, но это работает.

1 голос
/ 05 января 2015

Вы можете просто сделать это, если вы используете MVC5

public void OnResultExecuting(ResultExecutingContext filterContext)
{
   filterContext.HttpContext.Response.Redirect("http://www.google.com");
}
1 голос
/ 23 августа 2011

Мне нужно было перенаправить из OnActionExecuting, и в итоге я сделал это, и это сработало:

    filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary
                    {{"controller", "Base"}, {"action", "Error"}, {"errorMessage", errorMessage}});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...