小编典典

如何使自定义错误页面在 ASP.NET MVC 4 中工作

all

我想要为 500、404 和 403 显示自定义错误页面。这是我所做的:

  1. 在 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" />
    

  2. 在类中注册HandleErrorAttribute为全局动作过滤器FilterConfig如下:

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    

    {
    filters.Add(new CustomHandleErrorAttribute());
    filters.Add(new AuthorizeAttribute());
    }

  3. 为上述每条消息创建了一个自定义错误页面。500 的默认值已开箱即用。

  4. 在每个自定义错误页面视图中声明该页面的模型是System.Web.Mvc.HandleErrorInfo

对于 500,它显示自定义错误页面。对于其他人,它没有。

有什么我想念的吗?

OnException当我阅读类方法中的代码时,看起来这并不是显示自定义错误的全部HandleErrorAttribute,它只处理 500 个。

我该怎么做才能处理其他错误?


阅读 58

收藏
2022-05-17

共1个答案

小编典典

我当前的设置(在 MVC3 上,但我认为它仍然适用)依赖于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>
2022-05-17