it-swarm.com.de

So verwenden Sie Html.ActionLink richtig mit ASP.NET MVC 4-Bereichen

Ich habe kürzlich Bereiche in ASP.NET MVC 4 entdeckt, die ich erfolgreich implementiert habe, aber ich habe Probleme mit dem @Html.ActionLink-Helfer in meinen Ansichten von Razor. Die von diesem Helfer generierte URL scheint immer relativ zu der URL der aktuellen Seite zu sein.

Ich habe meine Website in IIS 7 (Win7) als virtuelles Anwendungsverzeichnis unter /Foo konfiguriert.

Ich habe zwei Bereiche registriert: Admin und Blogs. Ich habe den Standardcode in den AdminAreaRegistration.cs- und BlogsAreaRegistration.cs-Dateien. Ich habe namespaces = new[] { "MvcProject.Controllers" } zu den Standardeinstellungen von RouteConfig hinzugefügt:

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 zur Startseite für meine Website gehe: http://localhost/Foo, wird die Startseite für meine Website korrekt geladen. Zu diesem Zeitpunkt haben alle Aktionslinks ihre korrekten 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>

Das wird das HTML korrekt 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 beispielsweise zu "Blogs" navigiere, wird diese URL korrekt in den Browser geladen: /Foo/Blogs/Home.

Jetzt ändern die Links in meiner Hauptnavigation ihre URLs in:

<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 /" an den Namen des virtuellen Verzeichnisses IIS angehängt wird, sodass /Foo/Blogs/Home jetzt /Foo/Blogs/Blogs/Home ist.

Die Controller und Ansichten werden gut gerendert. Es sind nur die Aufrufe von @Html.ActionLink in meiner MvcProject/Views/Shared/_Layout.cshtml-Ansicht, die nicht wie erwartet funktionieren.

Es fühlt sich an, als würde mir etwas Triviales fehlen, aber es gab noch keine Antwort. Jeder Blogbeitrag und jedes Lernprogramm, das ich für die Implementierung von Areas in ASP.NET MVC4 gefunden habe, erwähnt keine Änderungen im Verhalten von @Html.ActionLink.

38
Greg Burghardt

Ich hasse es, meine eigene Frage zu beantworten, aber @Matt Bodily hat mich auf den richtigen Weg gebracht.

Die @Html.Action-Methode ruft tatsächlich einen Controller auf und rendert die Ansicht, sodass in meinem Fall kein HTML-Snippet erstellt werden kann, da dies einen rekursiven Funktionsaufruf verursacht, der zu einer StackOverflowException führt. Die @Url.Action(action, controller, { area = "abc" }) gibt zwar die URL zurück, aber schließlich entdeckte ich eine Überladung von Html.ActionLink, die eine bessere Lösung für meinen Fall bot:

@Html.ActionLink("Admin", "Index", "Home", new { area = "Admin" }, null)

Hinweis:, null ist in diesem Fall von Bedeutung, um der rechten Signatur zu entsprechen.

Dokumentation: @ Html.ActionLink (LinkExtensions.ActionLink)

Dokumentation für diese bestimmte Überladung:

LinkExtensions.ActionLink (Controller, Aktion, Text, RouteArgs, HtmlAttributes)

Es war schwierig, eine Dokumentation für diese Helfer zu finden. Ich neige dazu, nach "Html.ActionLink" zu suchen, wenn ich wahrscheinlich nach "LinkExtensions.ActionLink" hätte suchen sollen, wenn dies in der Zukunft jemandem hilft.

Die Antwort von Matt wird immer noch als Antwort bezeichnet.

Bearbeiten: Es wurde ein weiterer HTML-Helfer gefunden, um dieses Problem zu lösen:

@Html.RouteLink("Admin", new { action = "Index", controller = "Home", area = "Admin" })
68
Greg Burghardt

Wie ich zu einem Bereich umleiten kann, fügen Sie ihn als Parameter hinzu

@Html.Action("Action", "Controller", new { area = "AreaName" })

für den href-Teil eines Links verwende ich

@Url.Action("Action", "Controller", new { area = "AreaName" })
16
Matt Bodily

Nur um mein Bit zusammenzufassen:
Denken Sie daran, dass Sie mindestens zwei Bereiche in Ihrer MVC-Anwendung haben müssen, damit der routeValues: { area="" } funktioniert. Andernfalls wird der Bereichswert als Parameter für die Abfragezeichenfolge verwendet, und die Verknüpfung sieht folgendermaßen aus: /?area= 

Wenn Sie nicht über mindestens zwei Bereiche verfügen, können Sie dieses Verhalten folgendermaßen beheben:
1. Bearbeiten Sie die Standardroute in RouteConfig.cs wie folgt:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { area = "", controller = "Home", action = "Index", id = UrlParameter.Optional }
);

OR
2. Hinzufügen eines Dummy-Bereichs zu Ihrem MVC-Projekt.

2
Achilles

Im Folgenden finden Sie einige Möglichkeiten, wie Sie in MVC eine Link-Schaltfläche erstellen können.

@Html.ActionLink("Admin", "Index", "Home", new { area = "Admin" }, null)  
@Html.RouteLink("Admin", new { action = "Index", controller = "Home", area = "Admin" })  
@Html.Action("Action", "Controller", new { area = "AreaName" })  
@Url.Action("Action", "Controller", new { area = "AreaName" })  
<a class="ui-btn" data-val="abc" href="/Home/Edit/ANTON">Edit</a>  
<a data-ajax="true" data-ajax-method="GET" data-ajax-mode="replace" data-ajax-update="#CustomerList" href="/Home/Germany">Customer from Germany</a>  
<a data-ajax="true" data-ajax-method="GET" data-ajax-mode="replace" data-ajax-update="#CustomerList" href="/Home/Mexico">Customer from Mexico</a> 

Hoffe, das wird dir helfen.

0
Suraj Kumar