作为一种全面处理错误的方法,我将其添加到我的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
?
答案 0 :(得分:2)
在进行定义时,filterContext.Result
是ActionResult
的类型,它是与ViewResult和RedirectToRouteResult兼容的返回类型。
如何ViewResult
函数只是将指定视图呈现给响应流。
在另一端RedirectToAction
返回RedirectToRouteResult
,它也是从ActionResult
派生的,它根据给定的路由执行HTTP重定向到由路由引擎确定的URL数据
因此,在您的情况下,您需要重定向,因此您必须使用RedirectToAction("Error", "Error");
,因为它将返回RedirectToRouteResult
并重定向到您指定的路线。< / p>