質問

これまでのところ(Brevityのために)私はGlobal.ASAXに1つのルートを持っています。

routes.Add(new LowercaseRoute("{action}/{id}", new MvcRouteHandler())
  {
    Defaults = new RouteValueDictionary(new { controller = "Home", action = "Index", id = UrlParameter.Optional }),
    DataTokens = rootNamespace
  }); 

「rootnamespace」があります

var rootNamespace = new RouteValueDictionary(new { namespaces = new[] { "MyApp.Web.Controllers" } });

LowerCaserouteはルートから継承し、すべてのパスを小文字にするだけです。このような領域も登録されています。

context.Routes.Add(new LowercaseRoute("admin/{controller}/{action}/{id}", new MvcRouteHandler())
  {
    Defaults = new RouteValueDictionary(new { action = "List", id = UrlParameter.Optional }),
    DataTokens = adminNamespace
  });

AdminNamesPaceは別の名前空間であり、デフォルトルートと同じアイデアですが、適切な名前空間があります。これは正常に機能します。このように見えるURLにアクセスできます。

http://example.com/contact  <- default route, "Home" controller
http://example.com/admin/account  <- area route, "Account" controller, default "List" action

問題はこれです

http://example.com/admin/home/contact

また、機能します。 「管理」領域の下に「連絡先」アクションを備えた「ホーム」コントローラーはありません。 「/連絡先」から適切なページを引き出しますが、URLは「/admin/home/contact」です。

これが起こらないようにする方法はありますか?

ありがとう。

役に立ちましたか?

解決

arearegistrationcontext.maprouteのコードをご覧ください:

public Route MapRoute(string name, string url, object defaults, object constraints, string[] namespaces) {
    if (namespaces == null && Namespaces != null) {
        namespaces = Namespaces.ToArray();
    }

    Route route = Routes.MapRoute(name, url, defaults, constraints, namespaces);
    route.DataTokens["area"] = AreaName;

    // disabling the namespace lookup fallback mechanism keeps this areas from accidentally picking up
    // controllers belonging to other areas
    bool useNamespaceFallback = (namespaces == null || namespaces.Length == 0);
    route.DataTokens["UseNamespaceFallback"] = useNamespaceFallback;

    return route;
}

特に注意してください USENAMESPACEFOLLBACK トークン。デフォルトではfalseに設定されています。検索をエリアの名前空間に制限する場合は、同様のロジックが必要です。 (true =コントローラーの現在の名前空間を検索し、すべての名前空間を検索することに失敗します。false =現在の名前空間のみを検索します。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top