既存のアプリケーションをASP.NETWebフォームからASP.NETMVCに移動しています。
adminディレクトリとpublicディレクトリの両方に存在するページ名がいくつかあります。たとえば、/help/や/admin/help/などです。
名前空間はディレクトリ構造と一致するため、/ helpページはMyApplication.Helpにあり、/ admin/helpはMyApplication.Admin.Helpにあります。コントローラのセットアップを維持したいので、理想的にはMyApplication.Help.HelpControllerとMyApplication.Admin.Help.HelpControllerが必要です。
私はそのようなルートを設定しました
routes.MapRoute(
"Admin",
// Route name
"admin/{controller}/{action}/{id}",
// URL with parameters
new { controller = "Home", action = "Index", id = "" },
// Parameter defaults
new []{"MyApplication.Admin.*"}
//namespaces to find controller in
).DataTokens["UseNamespaceFallback"] = false;
routes.MapRoute(
"Default",
// Route name
"{controller}/{action}/{id}",
// URL with parameters
new { controller = "Home", action = "Index", id = "" },
// Parameter defaults
new [] { "MyApplication.*" }
//namespaces to find controller in
).DataTokens["UseNamespaceFallback"] = false;
この設定では、/ admin / helpルートは正常に機能しますが、/ helpルートは失敗し、複数のタイプが「help」と呼ばれるコントローラーに一致することを訴えます(MyApplication.Help.HelpControllerとMyApplication.Admin.Help.HelpControllerの両方が明らかに一致するため) MyApplication。*名前空間を指定しました)。
どちらかを行うことは可能ですか
2番目のルートが「管理者以外のもの」と一致するように2つのルートの名前空間を設定します
2つのルートの名前空間を設定して、2番目のルートが一致するのは、フォルダーのレイヤーが1つだけで、2つのレイヤーがない場合のみになるようにします。
- コントローラを探す名前空間をルートに指示するカスタムメソッドを記述します(このロジックを自分で実装できるようにします)?
残念ながら、フォルダー階層を変更する(たとえば、管理者以外のすべてのページを「パブリック」フォルダー/名前空間の下に置く)ことはできません(MVCに段階的に移行しているため、一部のページは引き続きWebフォームとして提供されます)。