2

既存のアプリケーションを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。*名前空間を指定しました)。

どちらかを行うことは可能ですか

  1. 2番目のルートが「管理者以外のもの」と一致するように2つのルートの名前空間を設定します

  2. 2つのルートの名前空間を設定して、2番目のルートが一致するのは、フォルダーのレイヤーが1つだけで、2つのレイヤーがない場合のみになるようにします。

  3. コントローラを探す名前空間をルートに指示するカスタムメソッドを記述します(このロジックを自分で実装できるようにします)?

残念ながら、フォルダー階層を変更する(たとえば、管理者以外のすべてのページを「パブリック」フォルダー/名前空間の下に置く)ことはできません(MVCに段階的に移行しているため、一部のページは引き続きWebフォームとして提供されます)。

4

1 に答える 1

1

少なくとも今のところ、これが私がやったことです。管理者以外のルートについては、適切な名前空間をすべて一覧表示し、アプリケーションの起動時にルートに登録するメソッドを作成しました。おそらくそれはアプリケーションの起動をいくらか遅くしているでしょうが、私は違いを認識できません。

誰かがより良いアプローチを持っているなら、私はそれを聞いてうれしいです。

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
GetNonAdminNamespaces()
    //namespaces to find controller in
).DataTokens["UseNamespaceFallback"] = false;


  private static string[] GetNonAdminNamespaces()
  {
      var namespaces = new HashSet<string>();
      System.Type[] allTypes =  Assembly.GetCallingAssembly().GetTypes();
      foreach (var item in allTypes)
      {
          string ns = item.Namespace;
          if ( !string.IsNullOrEmpty(ns) && ns.StartsWith("MyApplication.") && !ns.StartsWith("MyApplication.Admin."))
          {
              namespaces.Add(ns);
          }
      }
      return namespaces.ToArray();
  }
于 2013-03-26T13:38:39.433 に答える