StructureMap& 404错误

时间:2011-07-13 11:37:36

标签: .net asp.net-mvc asp.net-mvc-3 routing structuremap

我将此作为我的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

2 个答案:

答案 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" }
                );