C# 为什么MVC OneException中处理的异常不会命中错误控制器操作?
作为一种全面处理错误的方法,我将其添加到我的MVC web应用程序中的BaseController中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."
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。
您基本上需要做的是重定向到controllerErrorController
@ChetanRanpariya的控制器操作Error
,代码肯定就是这么做的?行filterContext.RoutedData.Values[“controller”]=“Error”应指向ErrorController,ViewName应转到Error视图?可能您必须像dis wayfilterContext.Result=this.RedirectToAction(“Error”,“Error”)代码>