c# – 为什么在MVC OnException中处理的异常没有命中错误控制器操作?

作为一种处理错误的全能方法,我将其添加到我的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派生的,它根据给定的路由数据执行HTTP重定向到由路由引擎确定的URL.

所以在你的情况下你需要重定向,这就是你必须使用RedirectToAction(“错误”,“错误”)的原因;因为它将返回RedirectToRouteResult并重定向到您指定的路由.

点赞