2011-01-06 10 views
9

これまでのところ(簡潔にするために)私は、Global.asaxの内の1つのルートは次のように登録している: "rootNamespaceは"ASP.NET MVCのデフォルトルート

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

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

ある

どこLowercaseRouteはRouteから継承し、すべてのパスを小文字にします。私はまた、このように登録されたエリアがあります。

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

adminNamespaceは別の名前空間、デフォルトルートと同じ考え方であるが、右の名前空間を持ちます。

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にアクセスすることができます。 「管理」領域に「連絡先」アクションを持つ「ホーム」コントローラはありません。それは "/ contact"からURLを "/ admin/home/contact"にして正しいページを引っ張ります。

これを防ぐ方法はありますか?

ありがとうございました。

答えて

17

は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; 
} 

注デフォルトでfalseに設定されている特定のUseNamespaceFallbackトークン、で。エリアの名前空間への検索を制限したい場合は、同様のロジックを持つ必要があります。 (True =コントローラの現在のネームスペースを検索し、すべてのネームスペースを検索していない場合はFalse =現在のネームスペースのみを検索します)

+1

"UseNamespaceFallback = false"を管理領域に追加するDataTokens辞書は問題を解決しました。ありがとう! – pbz

関連する問題