3

コントローラーに関連付けられていないカスタム ページを作成できるようにしたいと考えています。これらのカスタム ページはすべて、既定のコントローラーにルーティングされます。次に、コントローラ クラスが通常どおり設定されている、カスタムではない他のページがあります。ルーティング ルールを両方の状況で機能させることができません。

次のようなルーティング ルールがあります。

    routes.MapRoute( _
        name:="Default", _
        url:="{controller}/{action}", _
        defaults:=New With {.controller = "Home", .action = "Index"} _
    )

    routes.MapRoute( _
         name:="Custom Page", _
         url:="{name}", _
         defaults:=New With {.controller = "Page", .action = "Index"} _
     )

この状況は、静的コントローラーでは機能しますが、カスタム ページでは機能しません。存在しないカスタム名 (url:="{name}") を持つコントローラーを常に検索しようとするため、「リソースが見つかりません」というエラーが発生します。

ルールを逆にすると、カスタム ページは正しく機能しますが、静的ページは機能しません。

問題は、両方のルールが互いに重複していることであることがわかっているため、最初に使用された方が常に使用されます。理想的には、ルーティングに X という名前のコントローラーを探すように指示できるようにしたいと考えています。存在する場合はそれを使用します。存在しない場合は、Y コントローラーにリダイレクトし、パラメーターとして X を渡します。現在、コントローラーが存在しない場合、次のルーティング ルールに進むことはなく、単にリソースが見つからないというメッセージが表示されます。

このようなことは可能ですか?

4

2 に答える 2

0

ここで、問題の解決策を提供します。ルートごとに、代替ルートを定義できます。代替ルートは、ルートのコントローラーがない場合に使用されます。

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

        var route = routes.MapRoute(
            name: "Dynamic",
            url: "{name}",
            defaults: new { controller = "Dynamic", action = "Index" });
        
        defaultRoute.AlternativeRoute = route;

手がかりは最新ラインにあり!

于 2013-08-08T05:05:17.140 に答える