自定义 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