Asp.net MVC学习日记四(如果无法Route,指向自定义的错误页面)

本文介绍如何在ASP.NET MVC中实现自定义404错误页面,包括通过覆盖默认路由处理未知请求及在控制器基类中处理未知动作。

这里面要分两种情况:一是,默认的Route无法匹配;二是,默认的Route匹配错误。

前提工作:

新建一个ErrorController

  public class ErrorController : Controller
    {
        public ActionResult Http404()
        {
            return View();
        }
    }

再添加Http404.aspx

 

针对第一种情况:

1、在Models下新建MyControllerFactory类

  public class MyControllerFactory : DefaultControllerFactory
    {
        protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext,Type controllerType)
        {
            try
            {
                return base.GetControllerInstance(requestContext,controllerType);
            }
            catch (HttpException ex)
            {
                int httpCode = ex.GetHttpCode();
                if (httpCode == (int)HttpStatusCode.NotFound)
                {
                    IController controller = new ErrorController();
                    ((ErrorController)controller).Http404();
                    return controller;
                }
                else
                {
                    throw ex;
                }
            }
        }
    }

2、在Global.asax文件Application_Start方法中,添加

ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());

那么http://localhost:1124/RandomController/RandomAction/RandomId会指定到自己的错误页面,但是http://localhost:1124/Homer/RandomAction/RandomId则不会。

那就要使用第二种情况了:

1、新建BaseController

   public class BaseController : Controller
    {
        protected override void HandleUnknownAction(string actionName)
        {
            RouteTo404(HttpContext);
        }
        public ActionResult RouteTo404(HttpContextBase context)
        {
            IController errorController = new ErrorController();
            RouteData rd = new RouteData();
            rd.Values.Add("controller", "Error");
            rd.Values.Add("action", "Http404");
            errorController.Execute(new RequestContext(context, rd));
            return new EmptyResult();
        }
    }

2、将现有的控制器把由继承自Controller改为BaseController

 

这样就ok了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leesmn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值