2011-01-06 25 views
9

Şimdiye kadar (kısalık için) Ben Global.asax içinde bir rota böyle kaydedildi: "RootNamespace"ASP.NET MVC Standart yolları

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

olduğunu

Nerede SmallcaseRoute, Rota'dan devralınır ve yalnızca tüm yolları küçük harf yapar. Ben de böyle kayıtlı bir alana sahip:

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

adminNamespace başka ad, varsayılan rota ile aynı fikir, ancak doğru ad ile.

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

sorun bu

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

da çalışır şudur: Bu iyi çalışır, ben şuna benzer URL'leri erişebilirler. "Yönetici" alanı altında "iletişim" eylemine sahip "ev" denetleyicisi yok. Doğru sayfayı "/ contact" dan, ancak "/ admin/home/contact" olmak üzere URL ile çeker.

Bunun olmasını önlemek için herhangi bir yolu var mı?

Teşekkürler.

cevap

17

AreaRegistrationContext.MapRoute için koda göz atın:

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

Not özellikle varsayılan olarak false olarak ayarlanır UseNamespaceFallback belirteci. Aramayı alanın ad alanıyla sınırlamak istiyorsanız benzer mantığa sahip olmanız gerekir. (True = denetleyici için geçerli ad alanını arayın ve tüm ad alanlarını aramada başarısız. Yanlış = yalnızca geçerli ad alanını arayın.)

+1

DataTokens sözlüğünün yönetici alanına "UseNamespaceFallback = false" eklenmesi sorunu çözdü. Teşekkürler! – pbz