Wie gebe ich einen Bereichsnamen in einem Aktionslink an?

156

Ich habe eine freigegebene Masterseite, die ich aus 2 verschiedenen Bereichen in meiner MVC 2-App verwende. Die Masterseite hat einen Aktionslink, der derzeit den Controller und die Aktion angibt, aber natürlich funktioniert der Link nicht, wenn ich mich im falschen Bereich befinde. Ich sehe keine Überlastung für Actionlink, der einen Bereichsparameter akzeptiert. Ist dies möglich?

Jeremy
quelle

Antworten:

245

Herausgefunden..

Html.ActionLink("Link Text", "ActionName", "ControllerName", new { Area = "AreaName" }, new{})
Jeremy
quelle
3
@ Pure.Krome - ja. Nichts Intuitives!
Jeremy
3
Stellen Sie sicher, dass vor oder nach dem Bereichsnamen kein Leerzeichen vorhanden ist. Andernfalls wird es einfach ignoriert ... und Sie werden sich dann vier Stunden lang fragen, was los ist ... genau wie ich.
Piotr Kula
Wie fügt man dort Parameter hinzu?
Yorro
Wie sieht das in Link übersetzt aus? Ich meine - wenn das Formular gerendert und an den Kunden zurückgegeben wird.
FrenkyB
79

Etwas, auf das ich unmittelbar danach gestoßen bin und auf das andere möglicherweise stoßen: Wenn Sie innerhalb eines Bereichs eine Verknüpfung zu einer Aktion herstellen müssen, die sich nicht in einem Bereich befindet, müssen Sie den Bereich weiterhin als leere Zeichenfolge angeben.

Ich habe beispielsweise MVC-Code in einen Bereich verschoben und festgestellt, dass ich URLs auf der Masterseite aktualisieren muss, die auf andere Seiten der Site verweisen.

Verwenden Sie, um eine URL für etwas anzugeben, das sich nicht in einem Bereich befindet

Html.ActionLink("home", "Index", new { area = "", controller = "Home" })
Frank Schwieterman
quelle
4
Das ist ein sehr guter Tipp! Aber es gibt nicht erwartete Ergebnisse mit MVC 2. Kleine Korrektur - Html.ActionLink ("home", "Index", neu {area = "", controller = "Home"})
Alexander Beletsky
15

Verwenden:

 Html.ActionLink("Text", "ActionName", "ControllerName", new { Area = "AreaName" }, null)

Hinweis : Der vierte Parameter dient zum Übergeben der Route Values. Wenn Sie einen leeren Parameter übergeben, wird die Stammstruktur berücksichtigt. Wenn Sie einen geeigneten Wert übergeben, wird dieser als Bereich verwendet.

Vergessen Sie auch nicht, nulloder new{}als 5. Parameter zu verwenden, da das Übergeben nulloder new {}Erstellen eines Aktionslinks die Methode für nicht überlastet (text,action,controller,route data)oder (text,action,controller,route data,html attribute)die richtige Methode verwendet

Subhash Rao
quelle
11

In MVC2 hat das Geben area="root"für mich wie folgt funktioniert

Html.ActionLink("Home", "Index", "Home", new { Area = "root" }, new{})
Sreejith
quelle
6

Ein guter Trick, den Sie ausführen können, wenn Sie einen Bereich häufig in einer Ansicht verwenden, besteht darin, ihn oben als Variable zu definieren:

@{ var awesomeArea = new { area = "Awesome" }; }

@Html.Action("Something", "Somewhere", awesomeArea)
@Html.ActionLink("Stuff", "FooBar", awesomeArea)
dav_i
quelle
4

Folgendes habe ich mir als Lösung ausgedacht, damit ein Benutzer eine Verbindung zu den vorgefertigten Authentifizierungssystemen herstellen kann.

Jeder meiner Bereiche verfügt über eine Version der Datei _LoginPartial.cshtml.

Ich könnte wahrscheinlich die Anwendung dazu bringen, eine einzelne Version der Datei zu verwenden, aber ich bin immer wieder auf Fehler gestoßen, wenn ich versucht habe, einen einzelnen Anmeldeteil zu verwenden.

Es ist nur eine geringfügige Änderung des ursprünglich generierten Loginpartials, aber es scheint gut zu funktionieren, wenn es in bestimmten Bereichen verwendet wird.

Hier ist der Code, der in allen verwendet wird:

@if (Request.IsAuthenticated)
{
    <text>
    Hello, @Html.ActionLink(User.Identity.Name, "Manage", "Account", new { area = "" }, htmlAttributes: new { @class = "username", title = "Manage" })!
    @using (Html.BeginForm("LogOff", "Account", new { area = "" }, FormMethod.Post, new { id = "logoutForm" }))
 {
        @Html.AntiForgeryToken()
        <a href="javascript:document.getElementById('logoutForm').submit()">Log off</a>
 }
    </text>
}
else
{
    <ul>
        <li>@Html.ActionLink("Register", "Register", "Account", new { area = "" }, htmlAttributes: new { id = "registerLink" })</li>
        <li>@Html.ActionLink("Log in", "Login", "Account", new { area = "" }, htmlAttributes: new { id = "loginLink" })</li>
    </ul>
}
Anthony Hart
quelle
Das explizite Einstellen der Funktion htmlAttributes:funktionierte sehr gut für die Verwendung mehrerer Parameter.
Travis J
2

Wenn Sie keinen Standard-Webanwendungslink wie Info, Home, Contac usw. aus dem Bereich verwenden können. Sie ändern die Zeilen

@Html.ActionLink("Ana Sayfa", "Index", "Home", new { area = "" }, new {})

von

Views \ Shared_Layout.cshtml

ErdincDonmez
quelle
1

In meiner ASP Net Core-App füge ich den Bereich einfach wie folgt zu den HTML-Attributen hinzu:

@Html.ActionLink("Link Text", "ActionName", "ControllerName", new { Area = "AreaName" , id = @Model.ID, name = @Model.name })
Moleius
quelle
0

Verwenden von

@Html.ActionLink("DisplayText", "ActionName", "ControllerName", new { area = "AreaName"}, null)

Wird erreichen, wonach Sie suchen.

Der DisplayText wird angezeigt (wie <a href="#">DisplayText</a>), der ActionName ist die Methode, die im Controller aufgerufen wird, und ControllerName ist offensichtlich der Controller, den Sie aufrufen möchten! Der nächste Parameter ist 'Routenwert', bei dem Sie Ihren Bereich hinzufügen würden. Wenn Sie sich derzeit in einem Bereich befinden und Home/Indexbeispielsweise zu Ihrem Stammverzeichnis zurückkehren möchten, belassen Sie den Wert als leere Zeichenfolge, z new { area = ""}. Der endgültige Wert ist 'HTML-Attribute' und wo Sie eine Klasse hinzufügen würden, wenn Sie möchten, und sollte ein sein, nullwenn Sie keine Attribute zum Hinzufügen haben. Da der letzte Parameter jedoch als "HTML-Attribute" angesehen wird; Damit Routenwerte erkannt werden, sollte dies der Fall seinnull

Rob P.
quelle