2011-07-13 29 views
0

私は私のDefaultControllerFactoryオーバーライドとしてこれを持っている:私はmydomain.com/asd/asd/asd/asd/asd/asdに行くときのStructureMap&404エラー

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

     } 

それが404例外をスローして、ルックス:

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のは、このようになりますWeb.configのcustomErrorsノードで何をすべきかを決定します。

customErrorsではなく、私のルートがこれを処理していると思うので、これが正しいかどうかは分かりません。

答えて

0

"404-PageNotFound"ルート宣言に問題があると思います。これをErrorControllerで処理したい場合は、asp.net mvcコントローラの命名規則の状態として、 "ErrorController"ではなく "Error"をルート値として指定する必要があります。あなたのケースでは、おそらくasp.netのデフォルトの404エラーは、 "ErrorController"にナビゲートできないためレンダリングされます。

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

ありがとうございました! – Jon

0

あなたのルート"{controller}/{action}/{id}"はあなたがそのような深いフォルダ構造を持っている場合、あなたはすべてのフォルダを処理するルートを追加する必要がmydomain.com/asd/asd/asd

を処理します。 404エラーがカスタムページはまだエラーページを表示するためにルートを必要とし、スローされた場合には、web.configファイル

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

にセットアップのcustomErrorsにあなたが持っていないページをキャッチするために

。この問題を解決するには、すべてのcustomErrorsのルートを追加するだけです。

すべてのエラーを処理する単一のページを指すようにcustomErrorsを設定できますが、最適な解決策ではありません。