【问题标题】:Why do exceptions handled in MVC OnException not hit error controller actions?为什么在 MVC OnException 中处理的异常没有命中错误控制器操作?
【发布时间】:2017-04-06 12:44:55
【问题描述】:

作为一种处理错误的包罗万象的方法,我将它添加到我的 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 正确调用控制器操作?

【问题讨论】:

  • 检查this ?
  • @Berkay 这根本不是问题。 OnException 肯定会被调用。但是当它重定向到错误控制器时,不会调用错误操作。
  • 您正在将 Result 属性设置为 ViewResult 的实例,这将返回名称指定的视图。您可以通过在 `ViewName = "Error",. It should say that viewname is not found. 中放置不同的视图名称来进行检查,您基本上需要做的是重定向到控制器 Error 的控制器操作 ErrorController
  • @ChetanRanpariya 当然这就是代码在做什么?行 filterContext.RouteData.Values["controller"] = "Error" 应该指向 ErrorController 而 ViewName 应该进入错误视图?
  • 可能你得试试这种方式filterContext.Result = this.RedirectToAction("Error", "Error");

标签: c# asp.net-mvc asp.net-mvc-4


【解决方案1】:

当您查看定义并看到 filterContext.ResultActionResult 的类型时,它是与 ViewResult 和 RedirectToRouteResult 兼容的返回类型。

ViewResult 的作用是如何将指定的视图呈现给响应流。

另一方面,RedirectToAction 返回一个 RedirectToRouteResult,它也派生自 ActionResult,它根据给定的路由数据执行 HTTP 重定向到由路由引擎确定的 URL。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    相关资源
    最近更新 更多