سؤال

حتى الآن (للإيجاز) لدي طريق واحد في Global.asax مسجل مثل هذا:

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

يعمل أيضا. لا يوجد وحدة تحكم "Home" مع إجراء "اتصال" ضمن منطقة "المسؤول". يسحب الصفحة الصحيحة من "/contact" ولكن مع وجود عنوان URL "/المسؤول/الصفحة الرئيسية/الاتصال".

هل هناك أي طريقة لمنع حدوث هذا؟

شكرًا.

هل كانت مفيدة؟

المحلول

ألقِ نظرة على رمز AreeRegistrationContext.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;
}

لاحظ على وجه الخصوص usenamepacepacefallback الرمز المميز ، الذي تم تعيينه على خطأ بشكل افتراضي. يجب أن يكون لديك منطق مماثل إذا كنت ترغب في الحد من البحث في مساحة اسم المنطقة. (True = ابحث في مساحة الاسم الحالية لوحدة التحكم ، وفشل في البحث عن جميع مساحات الأسماء. false = ابحث في مساحة الاسم الحالية فقط.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top