为什么MVC OnException中处理的异常没有达到错误控制器操作?

时间:2017-04-05 10:41:13

标签: 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.");

        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");
}

但是,如果错误未处理并在OnException上通过BaseController路由,则错误视图将按预期呈现,但控制器上的错误操作永远不会被命中。错误消息采用默认值,并且操作中的断点不会跳闸。

这是为什么?如何从OnException

正确调用控制器操作

1 个答案:

答案 0 :(得分:2)

在进行定义时,filterContext.ResultActionResult的类型,它是与ViewResult和RedirectToRouteResult兼容的返回类型。

如何ViewResult函数只是将指定视图呈现给响应流。

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

因此,在您的情况下,您需要重定向,因此您必须使用RedirectToAction("Error", "Error");,因为它将返回RedirectToRouteResult并重定向到您指定的路线。< / p>

相关问题