作为一种处理错误的全能方法,我将其添加到我的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并重定向到您指定的路由.