2009-05-20 42 views
6

簡單的問題。我如何去覆蓋我的控制器中的OnResultExecuting方法,並強制改變另一個ActionResult?asp .net mvc OnResultExecuting修改過濾器上下文結果

示例代碼如下。目前原始的ActionResutl繼續執行,並且我的新RedirectResult被忽略。

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

回答

9

如果您重寫OnActionExecuted方法將是可能的。

例子:

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

我需要從OnActionExecuting重定向,結束了這樣做的,它的工作:

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

我想知道同樣的事情。我搜索谷歌和遇到你的問題加上其他人和答覆似乎都是一樣的。使用IActionFilter.OnActionExecuted方法。

然而,這不是一個真正的答案,更多的工作,因爲@ randy-burden建議你可以修改/替換結果過濾器中的RedirectToRouteResult操作結果。那麼爲什麼不進行RedirectRoute操作呢?

如果你真的想redirct到IResultFilter.OnResultExecuting方法內特定的URL,然後你可以做以下任一操作:

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

你可以做這個,如果你正在使用MVC5

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