zoukankan      html  css  js  c++  java
  • 自定义 404 与 500 错误页面,URL 地址不会重定向(一)

    对于 404 与 500 错误发生时,我们希望自己定义一个更加人性化的页面。

    例子

    当访问下面这个地址时:

    http://localhost/aaaa/bbb/ccc/ddd/eee/fff/ggg

    浏览器的 URL 不变,依然是

    http://localhost/aaaa/bbb/ccc/ddd/eee/fff/ggg

    但页面显示的是我们自定义的错误页面。

    一、在 web.config 里增加以下节点。

    <system.webServer>
        <httpErrors errorMode="Custom">
          <!--跳转 404 页面-->
          <remove statusCode="404" subStatusCode='-1' />
          <error statusCode="404" path="/error/404" prefixLanguageFilePath="" responseMode="ExecuteURL" />
        </httpErrors>
      </system.webServer>

    其中:

    path="/error/404"

    path 的值 “/error/404”是错误页面的 URL 地址,可以自己定义。

    当发生 404 错误时就会跳转到该地址。

    二、创建 404 错误的控制器。

    namespace WebApplication1.Controllers
    {
        using System.Web.Mvc;
    
        public class ErrorController : Controller
        {
            //
            // GET: /Error/
            public ActionResult Error404()
            {
                //这里使用的是“~/Views/Shared/Error.cshtml”页面。
                return View("Error");
            }
        }
    }

    增加路由规则:

    namespace WebApplication1
    {
        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Web;
        using System.Web.Mvc;
        using System.Web.Routing;
    
        public class RouteConfig
        {
            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                routes.MapRoute(
                    "error.404",
                    "error/404",
                    new { action = "Error404", controller = "Error" }
                );
    
                //routes.MapRoute(
                //    name: "Default",
                //    url: "{controller}/{action}/{id}",
                //    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
                //);
            }
        }
    }

    二、创建一个专门用来处理异常的过滤器。

    namespace WebApplication1.Filters
    {
        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Web;
        using System.Web.Mvc;
    
        public class CustomHandleErrorAttribute : HandleErrorAttribute
        {
            /// <summary>
            /// 异常处理。
            /// </summary>
            /// <param name="filterContext"></param>
            public override void OnException(ExceptionContext filterContext)
            {
                if (filterContext.Exception != null)
                {
                    //返回 500 错误。
                    filterContext.Result = new ViewResult
                    {
                        ViewName = View,
                        MasterName = Master,
                    };
    
                    filterContext.ExceptionHandled = true;
                    filterContext.HttpContext.Response.Clear();
                    filterContext.HttpContext.Response.StatusCode = 404;
                    filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
                    return;
                }
    
                base.OnException(filterContext);
            }
        }
    }

    由于 ASP.NET MVC 已经定义了“HandleErrorAttribute”,只要继承并重写“OnException”方法就可以了。

    在 Error.cshtml 页面加上:

    Response.Status = "404 Not Found";

    否则的话页面状态不正确。

    、将 CustomHandleErrorAttribute 注册成全局过虑器。

        public class FilterConfig
        {
            public static void RegisterGlobalFilters(GlobalFilterCollection filters)
            {
                filters.Add(new CustomHandleErrorAttribute());
            }
        }

    完成,现在不管是 404 还是 500 错误,都会使用 “~/Views/Shared/Error.cshtml”页面。

    下载地址:

    http://files.cnblogs.com/files/cjnmy36723/404%E4%B8%8E500%E9%94%99%E8%AF%AF%E9%A1%B5%E9%9D%A2%E6%BC%94%E7%A4%BA.rar

  • 相关阅读:
    创建一个Flex工程
    WebORB手动配置要点
    热血三国地图增强版
    vs2008 sp1无法加载实体模型工具的解决办法
    Berkeley DB for .NET使用
    FluorineFx使用自定义VO(实现IExternalizable接口)
    PD生成数据表时出现“未能准备语句”
    替换AsWing的JTree组件中的图标
    参数传递
    c# 32位16位MD5加密
  • 原文地址:https://www.cnblogs.com/cjnmy36723/p/4582577.html
Copyright © 2011-2022 走看看