我想要为 500、404 和 403 显示自定义错误页面。这是我所做的:
在 web.config 中启用了自定义错误,如下所示:
<customErrors mode="On" defaultRedirect="~/Views/Shared/Error.cshtml"> <error statusCode="403" redirect="~/Views/Shared/UnauthorizedAccess.cshtml" /> <error statusCode="404" redirect="~/Views/Shared/FileNotFound.cshtml" />
在类中注册HandleErrorAttribute为全局动作过滤器FilterConfig如下:
HandleErrorAttribute
FilterConfig
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{ filters.Add(new CustomHandleErrorAttribute()); filters.Add(new AuthorizeAttribute()); }
为上述每条消息创建了一个自定义错误页面。500 的默认值已开箱即用。
在每个自定义错误页面视图中声明该页面的模型是System.Web.Mvc.HandleErrorInfo
System.Web.Mvc.HandleErrorInfo
对于 500,它显示自定义错误页面。对于其他人,它没有。
有什么我想念的吗?
OnException当我阅读类方法中的代码时,看起来这并不是显示自定义错误的全部HandleErrorAttribute,它只处理 500 个。
OnException
我该怎么做才能处理其他错误?
我当前的设置(在 MVC3 上,但我认为它仍然适用)依赖于ErrorController,所以我使用:
ErrorController
<system.web> <customErrors mode="On" defaultRedirect="~/Error"> <error redirect="~/Error/NotFound" statusCode="404" /> </customErrors> </system.web>
控制器包含以下内容:
public class ErrorController : Controller { public ViewResult Index() { return View("Error"); } public ViewResult NotFound() { Response.StatusCode = 404; //you may want to set this to 200 return View("NotFound"); } }
以及您实现它们的方式的视图。不过,我倾向于添加一些逻辑,以在应用程序处于调试模式时显示堆栈跟踪和错误信息。所以 Error.cshtml 看起来像这样:
@model System.Web.Mvc.HandleErrorInfo @{ Layout = "_Layout.cshtml"; ViewBag.Title = "Error"; } <div class="list-header clearfix"> <span>Error</span> </div> <div class="list-sfs-holder"> <div class="alert alert-error"> An unexpected error has occurred. Please contact the system administrator. </div> @if (Model != null && HttpContext.Current.IsDebuggingEnabled) { <div> <p> <b>Exception:</b> @Model.Exception.Message<br /> <b>Controller:</b> @Model.ControllerName<br /> <b>Action:</b> @Model.ActionName </p> <div style="overflow:scroll"> <pre> @Model.Exception.StackTrace </pre> </div> </div> } </div>