Wie man Html.ActionLink mit ASP.NET MVC 4 Bereichen richtig benutzt
Ich vor kurzem entdeckt habe Bereiche, in ASP.NET MVC 4, die ich erfolgreich umgesetzt haben, aber ich bin in Schwierigkeiten mit der @Html.ActionLink
Helfer in meinem Razor-Ansichten. Die URL dieser Helfer generiert immer zu sein scheint, relativ zur URL der aktuellen Seite.
Ich habe meine web-site in IIS konfiguriert 7 (Win7) als eine Anwendung das virtuelle Verzeichnis an /Foo
.
Ich habe zwei Bereichen registriert: Admin und Blogs. Ich habe die Standard-code in der AdminAreaRegistration.cs
und BlogsAreaRegistration.cs
- Dateien. Ich fügte namespaces = new[] { "MvcProject.Controllers" }
den Vorgaben der Standard-RouteConfig:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new {
controller = "Home", action = "Index", id = UrlParameter.Optional,
namespaces = new[] { "MvcProject.Controllers" }
}
);
}
}
Wenn ich auf die Startseite meiner Website: http://localhost/Foo
es korrekt lädt die "home" - Seite für meine Website. An dieser Stelle, all die action, die links, die haben Ihre richtigen URLs.
Beispielcode aus MvcProject/Views/Shared/_Layout.cshtml
<h2>Main Navigation</h2>
<ul>
<li>@Html.ActionLink("Home", "Index", "Home")</li>
<li>@Html.ActionLink("Blogs", "Index", "Blogs/Home")</li>
<li>@Html.ActionLink("Admin", "Index", "Admin/Home")</li>
</ul>
Dies ist korrekt Rendern der HTML-als:
<h2>Main Navigation</h2>
<ul>
<li><a href="/Foo">Home</a></li>
<li><a href="/Foo/Blogs/Home"></li>
<li><a href="/Foo/Admin/Home"></li>
</ul>
Wenn ich im browser navigieren Sie zu "Blogs" zum Beispiel, diese URL lädt korrekt in den browser: /Foo/Blogs/Home
.
Nun die links in meiner main-navigation ändern Ihre URLs:
<h2>Main Navigation</h2>
<ul>
<li><a href="/Foo/Blogs/Home">Home</a></li>
<li><a href="/Foo/Blogs/Blogs/Home"></li>
<li><a href="/Foo/Blogs/Admin/Home"></li>
</ul>
Beachten Sie, dass "Blogs/" angefügt, um die virtuelle IIS-Verzeichnis-Namen, so dass /Foo/Blogs/Home
ist jetzt /Foo/Blogs/Blogs/Home
.
Den Controllern und views Rendern in Ordnung, es ist nur die Aufrufe @Html.ActionLink
in meinem MvcProject/Views/Shared/_Layout.cshtml
Sicht nicht so funktioniert, wie ich es erwartet habe.
Es fühlt sich an wie ich bin fehlt etwas trivial, aber keine Höhe suchen, kommen mit einer Antwort. Jedem blog-post und das tutorial habe ich gefunden, die für die Umsetzung in den Bereichen ASP.NET MVC4 macht keine Erwähnung von änderungen in der, wie @Html.ActionLink
verhält.
InformationsquelleAutor der Frage Greg Burghardt | 2014-03-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hasse die Beantwortung meiner eigenen Frage, aber @Matt Körperlichen setzte mich auf die richtige Spur.
Den
@Html.Action
Methode tatsächlich ruft ein controller und macht die Ansicht so, dass würde nicht funktionieren, erstellen Sie ein snippet von HTML in meinem Fall, da dies verursacht eine rekursive Funktion aufrufen, resultierenden in eine StackOverflowException. Die@Url.Action(action, controller, { area = "abc" })
hat in der Tat die Rückkehr der URL, aber ich entdeckte schließlich eine überlastung derHtml.ActionLink
zur Verfügung gestellt, dass eine bessere Lösung für meinen Fall:Hinweis:
, null
signifikant ist in diesem Fall, um den richtigen Unterschrift.Dokumentation: @Html.ActionLink (LinkExtensions.ActionLink)
Dokumentation für diese Besondere überlast:
LinkExtensions.ActionLink(Controller, Action, Text, RouteArgs, HtmlAttributes)
Es ist schon schwer zu finden Dokumentation für diese Helfer. Ich Neige zu der Suche nach "Html".ActionLink" als ich wahrscheinlich sollte haben gesucht "LinkExtensions.ActionLink", wenn das hilft jemand in der Zukunft.
Kennzeichnung noch Matt ' s Antwort als die Antwort.
Edit: Fand noch ein weiteres HTML-helper um dieses Problem zu lösen:
InformationsquelleAutor der Antwort Greg Burghardt
Wie ich eine Umleitung zu einem Bereich ist, fügen Sie es als parameter
für das href-Teil einen link, den ich verwenden
InformationsquelleAutor der Antwort Matt Bodily
Nur um mein bisschen:
Denken Sie daran, Sie sind gonna müssen mindestens 2 Bereiche im MVC-Anwendung, um die
routeValues: { area="" }
arbeiten; ansonsten ist die Gegend Wert wird als query-string-parameter und Ihr link wird wie folgt Aussehen:/?area=
Wenn Sie nicht wenigstens 2 Bereichen, können Sie beheben dieses Verhalten, indem Sie:
1. Bearbeiten der default-route in
RouteConfig.cs
wie diese:BZW.
2. Hinzufügen eines dummy-Bereich, um Ihre MVC-Projekt.
InformationsquelleAutor der Antwort Achilles