ASP.NET MVCデフォルトルートは、エリアルートを介してアクセス可能です
-
26-09-2019 - |
質問
これまでのところ(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 =現在の名前空間のみを検索します。)
所属していません StackOverflow