2009-05-20 14 views
6

Proste pytanie. Jak mam zastąpić metodę OnResultExecuting w moim kontrolerze i zamiast tego wymusić inny ActionResult?asp .net mvc OnResultWprowadzenie modyfikacji filterContext Wynik

Przykładowy kod znajduje się poniżej. Obecnie oryginalny ActionResutl jest nadal wykonywany, a mój nowy komunikat RedirectResult jest ignorowany.

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

Odpowiedz

9

Byłoby możliwe, gdyby zastąpić metodę OnActionExecuted.

Przykład:

protected override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     filterContext.Result = new RedirectResult("http://google.com"); 
     base.OnActionExecuted(filterContext); 
    } 
1

musiałem przekierować z OnActionExecuting i zakończyła się robi to i to działało:

filterContext.Result = new RedirectToRouteResult(
       new RouteValueDictionary 
        {{"controller", "Base"}, {"action", "Error"}, {"errorMessage", errorMessage}}); 
6

chciałem wiedzieć dokładnie to samo. Szukałem google i natknąłem się na twoje pytanie plus inne, a wszystkie odpowiedzi wyglądają tak samo. Użyj metody IActionFilter.OnActionExecuted.

Jednak to nie jest odpowiedź, ale raczej praca, ponieważ @ randy-load sugeruje, że możesz zmodyfikować/zastąpić wynik działania RedirectToRouteResult w filtrze wyników. Dlaczego więc nie można uzyskać akcji RedirectRoute?

Jeśli naprawdę chcesz redirct do określonego adresu URL wewnątrz metody IResultFilter.OnResultExecuting następnie można wykonać jedną z następujących czynności:

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

Or

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

W pierwszej opcji, są ręcznie wykonując RedirectResult i wykonując filterContext.Cancel = true, mówisz frameworkowi, że nie musisz uruchamiać filterContext.Result. W drugiej opcji zasadniczo robisz to samo, ale zamiast tego, że RedirectResult konfiguruje odpowiedź Http, robisz to sam.

W moim przypadku chciałem dołączyć dodatkowy parametr zapytania do adresu URL przekierowania i powiedzieć ramce, dla której chciałem anulować wynik działania przekierowania, a następnie przekierowanie mimo wszystko wydawało się trochę złe, ale działa.

1

Można to zrobić tylko jeśli używasz MVC5

public void OnResultExecuting(ResultExecutingContext filterContext) 
{ 
    filterContext.HttpContext.Response.Redirect("http://www.google.com"); 
} 
Powiązane problemy