我想要一个自定义错误页面显示为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" />
    
    </customErrors>
    
  2. FilterConfig类中将HandleErrorAttribute注册为全局操作筛选器,如下所示:

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new CustomHandleErrorAttribute());
        filters.Add(new AuthorizeAttribute());
    }
    
  3. 为上述每条消息创建了一个自定义错误页.500美元的默认价格已经是现成的了.

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

对于500,它显示自定义错误页面.对其他人来说,情况并非如此.

我有什么遗漏吗?

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

我必须做些什么来处理其他错误?

推荐答案

我目前的设置(在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");
    }
}

而视图就是你实现它们的方式.不过,我倾向于添加一些逻辑,以便在应用程序处于调试模式时显示堆栈跟踪和错误信息.所以我错了.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>

Asp.net相关问答推荐

IISExpress未在ARM64 Mac/.NET 4.8上启动

如何在 ASP.NET RadioButtonList 中的项目之间添加空格

web.config 部分的单独配置文件

*不*使用 asp.net 会员提供程序是个坏主意吗?

ASP.NET web api 无法获取 application/x-www-form-urlencoded HTTP POST

对布尔查询字符串参数使用true或1

免费的 ASP.Net 和/或 CSS 主题

ASP.net 与 PHP( Select 什么)

如何从 JS 访问 ViewBag

如何在 ASP.NET MVC3 中配置区域

您如何在 .net WebApi2 应用程序中的 OAuth2 令牌请求中使用额外参数

如何验证用户在 CheckBoxList 中 Select 了至少一个复选框?

为什么 HttpWebRequest 会抛出异常而不是返回 HttpStatusCode.NotFound?

在资源文件中使用 HTML

Twitter Bootstrap 和 ASP.NET GridView

global.asax 中的 Application_Error 未捕获 WebAPI 中的错误

如何在 ASP.Net MVC 3 中返回 HttpNotFound() 的视图?

ASP.NET Excel 导出编码问题

~/ 等价于 javascript

Facebook 连接和 ASP.NET