【问题标题】:StructureMap & 404 ErrorsStructureMap 和 404 错误
【发布时间】:2011-07-13 11:37:35
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    我认为问题出在“404-PageNotFound”路由声明中。如果您希望这由 ErrorController 处理,则应将“Error”指定为路由值,而不是“ErrorController”,如 asp.net mvc 控制器命名约定所述。在您的情况下,可能会呈现 asp.net 默认 404 错误,因为它无法导航到“ErrorController”

     routes.MapRoute(
                    "404-PageNotFound",
                    "{*url}",
                    new { controller = "Error", action = "PageNotFound" }
                    );
    

    【讨论】:

    • 谢谢,我看得太辛苦了!
    【解决方案2】:

    您的路线"{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 设置为指向将处理所有错误的单个页面,但这不是最佳解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-28
      • 2017-09-24
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      • 2013-12-26
      • 2010-09-16
      • 2016-11-21
      相关资源
      最近更新 更多