我将此作为我的DefaultControllerFactory覆盖:
public class StructureMapControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, System.Type controllerType)
{
if (controllerType == null) return base.GetControllerInstance(requestContext, controllerType);
return (IController)ObjectFactory.GetInstance(controllerType);
}
}
我的Global.asax看起来像这样:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("favicon.ico");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
routes.MapRoute(
"404-PageNotFound",
"{*url}",
new { controller = "ErrorController", action = "PageNotFound" }
);
}
当我转到mydomain.com/asd/asd/asd/asd/asd/asd
时,它会抛出404异常,然后查看web.config中的customErrors
节点以确定要执行的操作。
我不确定这是否正确,因为我认为我的路线会处理这个而不是customErrors
。
答案 0 :(得分:0)
您的路线"{controller}/{action}/{id}"
只会处理mydomain.com/asd/asd/asd
如果您有这么深的文件夹结构,那么您需要添加将处理所有文件夹的路由。
为了捕获未找到的页面,您必须在web.config中设置customErrors
<system.web>
<customErrors mode="On" defaultRedirect="~/error">
<error statusCode="404" redirect="~/error/notfound"></error>
</customErrors>
如果抛出404错误,自定义页面仍需要显示错误页面的路径。要解决该问题,只需为所有customErrors添加路由。
routes.MapRoute(
"404-PageNotFound",
"error/notfound",
new { controller = "ErrorController", action = "PageNotFound" }
);
您可以将customErrors设置为指向可处理所有错误的单个页面,但这不是最佳解决方案。
答案 1 :(得分:0)
我认为问题出在“404-PageNotFound”路由声明中。如果你想让它由ErrorController处理,你应该指定“Error”作为路由值,而不是“ErrorController”,因为asp.net mvc控制器命名约定规定。在您的情况下,可能会呈现asp.net默认404错误,因为它无法导航到“ErrorController”
routes.MapRoute(
"404-PageNotFound",
"{*url}",
new { controller = "Error", action = "PageNotFound" }
);