8

MVC 4の経路すべてを作成しようとすると(何かの例が見つかり、コードに基づいている)、404エラーが返されます。私はIIS 7.5でこれを実行しています。これはまっすぐな解決策のようですが、何が欠けていますか?MVC 4すべての経路が決して到達しない

「デフォルト」ルートの上にある「CatchAll」ルートを移動すると、1つのメモが機能します。しかし、当然のことながら、他のコントローラのどれにも到達していません。ここで

はコードです:

Route.Config:

 routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

     routes.MapRoute(
      "CatchAll", 
      "{*dynamicRoute}", 
      new { controller = "CatchAll", action = "ChoosePage" } 
     ); 

コントローラー:

public class CatchAllController : Controller 
{ 

    public ActionResult ChoosePage(string dynamicRoute) 
    { 
     ViewBag.Path = dynamicRoute; 
     return View(); 
    } 

} 

答えて

9

キャッチオールルートを作成するための究極の目標は、動的URLを処理することができるようになったと私はへの直接の答えを見つけることができませんでしたので、上記の元の問題、私は別の観点から私の研究に近づいた。そうすることで、私はこのブログの記事に出くわした:Custom 404 when no route matches

このソリューションはここ

(すなわちwww.mysite.com/this/is/a/dynamic/route)指定されたURL 内の複数のセクションの取り扱いを可能に最終カスタムコントローラコード:

public override IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName) 
{ 
    if (requestContext == null) 
    { 
     throw new ArgumentNullException("requestContext"); 
    } 

    if (String.IsNullOrEmpty(controllerName)) 
    { 
     throw new ArgumentException("MissingControllerName"); 
    } 

    var controllerType = GetControllerType(requestContext, controllerName); 

    // This is where a 404 is normally returned 
    // Replaced with route to catchall controller 
    if (controllerType == null) 
    { 
     // Build the dynamic route variable with all segments 
     var dynamicRoute = string.Join("/", requestContext.RouteData.Values.Values); 

     // Route to the Catchall controller 
     controllerName = "CatchAll"; 
     controllerType = GetControllerType(requestContext, controllerName); 
     requestContext.RouteData.Values["Controller"] = controllerName; 
     requestContext.RouteData.Values["action"] = "ChoosePage"; 
     requestContext.RouteData.Values["dynamicRoute"] = dynamicRoute; 
    } 

    IController controller = GetControllerInstance(requestContext, controllerType); 
    return controller; 
} 
+2

これはうまくいきます。これを行うと、foreachとsubstringを避けることができます: 'var dynamicRoute = string.Join("/"、requestContext.RouteData.Values.Values);' –

+0

良いコールNathan。私はこのコードを見てからしばらくしていました。私はいつも古いコードを改善する方法を見つける。これは確かにその時代の一つです。私はあなたの提案で答えを更新しました。ありがとう! – gsxrboy73

+0

これは素晴らしいことですが、私がここに来るたびに何かを学びます。このコードは素晴らしく、ベースコントローラーでこれを処理したいのかどうかを判断しようとしていましたが、コントローラーファクトリーにプッシュする方が良いアイデアです! –

4

どんなルートyour'reがあなたの第一にマッチされると、これをテストするので、それはおそらくです - デフォルトルート。 MVCのルーティングがどのように動作するかは、あなたが渡したアドレスは、あなたのルートコレクション内のルートを見た目の順にマッチさせようとします。第1のマッチング経路を見つけると、さらなる実行を中断する。この場合、デフォルトルートはリストの1番目のルートになります。一致していれば、2番目のルートは決して検査されません。

アドレスバーには基本的にhttp://www.mysite.com/Home/Testing/Item/Pageのような名前を書いてください。これはあなたのデフォルトルートに一致しないため、CatchAllルートに一致するようにしてください。

+1

これは私がテストしているルートです:http://mysite.com/hello、コントローラはありません。 – gsxrboy73

+1

あなたがルートのコントローラを持っていなくても、最初のシーケンシャルマッチングルート(この場合は "Default")を選択することになります。それはHelloControllerクラスのControllerを検索し、Indexアクションを持ったコントローラであり、見つからなければ404を取得します。 – cchamberlain

0

あなたのルート上の任意の文字列dynamicRouteパラメータを定義してみてください。

routes.MapRoute( 
     "CatchAll", 
     "{*dynamicRoute}", 
     new { controller = "CatchAll", action = "ChoosePage", dynamicRoute = UrlParameter.Optional }); 
+0

同じ結果を試しました。試してくれてありがとう。 – gsxrboy73

関連する問題