因此,根据我的理解,您希望将用户重定向到有关异常的特定错误页面,以及您希望访问异常的错误页面。
这是我尝试过的,创建了一个基本控制器并覆盖了该OnException
方法。在OnException
方法内部,我正在做您在Global.asax.cs
.
最重要的是,在处理异常之后,我RedirectAction
在Result
.ExceptionContext
为了Exception
从错误视图中访问,我将异常存储在TempData
. 从ErrorController
我将异常作为HandleErrorInfo
实例传递给视图。
这是完整的代码。
// BaseController
public class BaseController : Controller
{
protected override void OnException(ExceptionContext filterContext)
{
if (!filterContext.ExceptionHandled)
{
var action = "General";
if (filterContext.Exception is HttpException)
{
var httpException = filterContext.Exception as HttpException;
switch (httpException.GetHttpCode())
{
case 404:
// page not found
action = "Error404";
break;
case 500:
// server error
action = "Error500";
break;
default:
action = "General";
break;
}
}
filterContext.Result = RedirectToAction(action, "error");
TempData["error"] = new HandleErrorInfo(filterContext.Exception,
RouteData.Values["controller"].ToString(),
RouteData.Values["action"].ToString());
filterContext.ExceptionHandled = true;
}
}
}
// Error Controller
public class ErrorController : Controller
{
public ActionResult Error404()
{
return View(TempData["error"] as HandleErrorInfo);
}
// other methods
}
// Sample controller derives from BaseController.
public class HomeController : BaseController
{
public ActionResult Index()
{
return View();
}
public ActionResult NotFound()
{
throw new HttpException(404, "Not Found");
}
}
// Error404.cshtml
@model System.Web.Mvc.HandleErrorInfo
@{
ViewBag.Title = "404 Not Found";
}
<h2>@ViewBag.Title</h2>
<p>
Last Exception: @Model.Exception
</p>
更新:这种方法的一个缺点是我们可以处理 HTTP 异常 404、500 或其他任何情况,如果它仅从控制器操作中抛出。