Vanilla MVC4: Step 11 – Routing I

Jetzt nun ein erster Post, der das Routing ein wenig auseinandernimmt. Zunächst in Bezug auf Areas. Um Links auf Controller korrekt zu bauen, ist ab sofort die Area notwendig.

In unserem Layout _RootLayout.cshtml passen wir also das Menu wie folgt an:

Den Brand-Link:

@Html.ActionLink("LeanBook", "Index", "Default", new { area="" }, new { @class="brand" })

Und die Navigation:

<ul class="nav" id="page-nav">
  <li class="active" data-mi="home">
    @Html.ActionLink("Home", "Index", "Default", new { area="" }, null)
  </li>
  <li data-mi="github">
    @Html.ActionLink("GitHub", "Index", "Home", new { area="GitHub" }, null)
  </li>
  <li data-mi="links"><a href="/#Links">Links</a></li>
  <li data-mi="todo"><a href="/#Todo">Todo</a></li>
  <li data-mi="about">
    @Html.ActionLink("Über", "About", "Default", new { area="" }, null)
  </li>
</ul>

Das Weglassen des Controllers funktioniert übrigens nicht. Es wird dann nicht der Default-Controller gewählt – sondern der aktuelle. Trotzdem lassen sich die erzeugten URLs kürzen, wenn wir in der GitHubAreaRegistration auch einen Default-Controller festlegen – nämlich den Home.

Immer noch sieht übrigens das globale Routing den HomeController der GitHub-Area (siehe http://localhost:1487/Home), aber umgedreht das Area-Routing nicht den DefaultController (siehe http://localhost:1487/GitHub/Default/).

Ein Blick auf das die Routen in Glimpse bringt uns der Lösung etwas näher:

Route DataTokens

Während die Area-Route DataTokens enthält wie Namespaces, area und UseNamespaceFallback sind die Tokens bei der globalen Route nicht vorhanden. Dabei weist Namespaces das Routing an, nur Controller aus diesem(n) Bereich(en) zu durchsuchen (ein String-Array), und UseNamespaceFallback erlaubt – wenn true – auch den Fallback auf alle anderen Namespaces. Wir müssen also beim globalen Routing ebenso die Namespaces festlegen und den Fallback unterbinden:

RouteTable.Routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}",
    defaults: new { controller = "Default", action = "Index" },
    namespaces: new string[] { "Malt.Vanilla.Web.UI.Controllers" }
).DataTokens["UseNamespaceFallback"] = false;

Nun verhält sich das Routing ersteinmal konsistent. Zeit, um die beiden weiteren Areas Links und Todo anzulegen. Jeweils mit HomeController und Index-Action plus View. Nicht vergessen: jeweils _ViewStart.cshtml kopieren und (falls gewünscht) den Default-Controller in der AreaRegistration einzustellen sowie natürlich die Links im _RootLayout.cshtml anzupassen.

Übrigens wer jetzt die Namespaces-Einschränkungen wieder entfernt, erzeugt ein neues Problem beim Aufruf der (ohnehin unsinnigen) Url: http://localhost:1487/Home. Aber das gleiche Problem tritt natürlich auch dann auf, falls ein globaler Controller ebenso ein HomeController wäre …

No Namespace Routing

Fehler klar?!

Leave a Reply

Your email address will not be published. Required fields are marked *