Frage

Bisher (für Kürze) habe ich eine Route in Global.asax wie folgt:

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

Wo "RootNameSpace" ist

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

LowerCaseroute erbt von der Route und macht nur alle Wege Kleinbuchstaben. Ich habe auch einen Bereich wie diesen:

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

Wobei adminnamespace ein anderer Namespace ist, gleiche Idee wie in der Standardroute, jedoch mit dem richtigen Namespace. Dies funktioniert gut, ich kann auf URLs zugreifen, die so aussehen:

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

Das Problem ist, dass dies dies

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

funktioniert auch. Es gibt keinen "Home" -Controller mit einer "Kontakt" -Kaktion im Bereich "Admin". Es zieht die rechte Seite von "/contact", aber die URL ist "/admin/home/contact".

Gibt es eine Möglichkeit, dies zu verhindern?

Vielen Dank.

War es hilfreich?

Lösung

Schauen Sie sich den Code für areareegistrationContext.maproute an:

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

Beachten Sie insbesondere die UsenamesspaceFackback Token, das standardmäßig auf false gesetzt ist. Sie müssen eine ähnliche Logik haben, wenn Sie die Suche auf den Namespace des Gebiets einschränken möchten. (TRUE = Suchen Sie den aktuellen Namespace für den Controller und fehlen, die alle Namespaces durchsuchen. False = Suchen Sie nur den aktuellen Namespace.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top