这里面要分两种情况:一是,默认的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了