C# 为什么MVC OneException中处理的异常不会命中错误控制器操作?

C# 为什么MVC OneException中处理的异常不会命中错误控制器操作?,c#,asp.net-mvc,asp.net-mvc-4,C#,Asp.net Mvc,Asp.net Mvc 4,作为一种全面处理错误的方法,我将其添加到我的MVC web应用程序中的BaseController中 public class BaseController : Controller { protected override void OnException(ExceptionContext filterContext) { _logger.Error(filterContext.Exception, "Website error page displayed."

作为一种全面处理错误的方法,我将其添加到我的MVC web应用程序中的BaseController中

public class BaseController : Controller
{
    protected override void OnException(ExceptionContext filterContext)
    {
        _logger.Error(filterContext.Exception, "Website error page displayed.");

        TempData["ErrorMessage"] = "Unspecified error - please contact support";
        filterContext.RouteData.Values["controller"] = "Error";
        filterContext.Result = new ViewResult
        {
            ViewName = "Error",
        };

        filterContext.ExceptionHandled = true;
    }
}
我有一个专用的ErrorController,看起来像这样:

public class ErrorController : BaseController
{
    [AllowAnonymous]
    public ActionResult Error()
    {
        string errorMessage = "There has been an error";
        if(TempData["ErrorMessage"] != null)
        {
            errorMessage = TempData["ErrorMessage"].ToString();
        }

        Logger.Warn("Error error page displayed with message {0}", errorMessage);
        ViewBag.ErrorMessage = errorMessage;
        return View("Error");
    }
}
当在应用程序的一部分中处理错误并将用户重定向到错误页面时,此操作正常:

if (!await UserManager.IsEmailConfirmedAsync(user.Id))
{
    TempData["ErrorMessage"] = "You must have a confirmed email to log on.";
    return RedirectToAction("Error", "Error");
}
但是,如果错误未经处理,并通过
BaseController
上的
OnException
路由,则错误视图将按预期呈现,但控制器上的错误操作从未命中。错误消息采用默认值,操作中的断点不会被触发


为什么会这样?如何从
OnException
正确调用控制器操作?

转到定义并查看
filterContext。Result
ActionResult
的类型,它是与ViewResult和RedirectToRouteResult兼容的返回类型

ViewResult
的作用是:它只是将指定的视图呈现给响应流

在另一端,
RedirectToAction
返回一个
RedirectToRouteResult
,该结果也是从
ActionResult
派生的,它根据给定的路由数据执行到路由引擎确定的URL的HTTP重定向


因此,在您的情况下,您需要重定向,这就是您必须使用
重定向操作(“错误”、“错误”)的原因
因为它将返回一个
重定向路由结果
并重定向到您指定的路由。

检查?@Berkay这根本不是问题所在。一个例外肯定会被调用。但是当它重定向到错误控制器时,不会调用错误操作。您正在将Result属性设置为
ViewResult
的实例,该实例将返回由名称指定的视图。您可以通过在“ViewName=”Error“,
中放置不同的视图名称进行检查。应该说找不到viewname。
您基本上需要做的是重定向到controller
ErrorController
@ChetanRanpariya的控制器操作
Error
,代码肯定就是这么做的?行filterContext.RoutedData.Values[“controller”]=“Error”应指向ErrorController,ViewName应转到Error视图?可能您必须像dis way
filterContext.Result=this.RedirectToAction(“Error”,“Error”)