StructureMap & 404 Ошибки - PullRequest
       8

StructureMap & 404 Ошибки

0 голосов
/ 13 июля 2011

У меня есть это как переопределение 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, а затем просматривает узел customErrors в файле web.config, чтобы решить, что делать.

Я не уверен, правильно ли это или нет, потому что я думал, что мои маршруты справились бы с этим, а не customErrors.

Ответы [ 2 ]

0 голосов
/ 13 июля 2011

Я думаю, что проблема в объявлении маршрута "404-PageNotFound".Если вы хотите, чтобы это обрабатывалось ErrorController, вы должны указать «Error» в качестве значения маршрута, а не «ErrorController», как говорится в соглашении об именовании контроллера asp.net mvc.В вашем случае, вероятно, ошибка asp.net по умолчанию 404 отображается, потому что он не может перейти к «ErrorController»

 routes.MapRoute(
                "404-PageNotFound",
                "{*url}",
                new { controller = "Error", action = "PageNotFound" }
                );
0 голосов
/ 13 июля 2011

Ваш маршрут "{controller}/{action}/{id}" будет обрабатывать только mydomain.com/asd/asd/asd

, если у вас такая глубокая структура папок, тогда вам нужно добавить маршруты, которые будут обрабатывать все папки.

Чтобычтобы отследить не найденные страницы, вы должны настроить customErrors в web.config

<system.web>
   <customErrors mode="On" defaultRedirect="~/error">
      <error statusCode="404" redirect="~/error/notfound"></error>
   </customErrors>

Когда выдается ошибка 404, пользовательской странице все еще нужен маршрут для отображения страницы ошибки .Чтобы решить эту проблему, просто добавьте маршруты для всех пользовательских ошибок.

 routes.MapRoute(
            "404-PageNotFound",
            "error/notfound",
            new { controller = "ErrorController", action = "PageNotFound" }
            );

Вы можете настроить customErrors так, чтобы указывать на одну страницу, которая будет обрабатывать все ошибки, но это не лучшее решение.

...