自定义 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”页面。

下载地址:

https://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

 

posted @ 2015-06-17 10:32  cjnmy36723  阅读(938)  评论(0编辑  收藏  举报