HTML.ActionLink vs Url.Action in ASP.NET Razor


304

Gibt es einen Unterschied zwischen HTML.ActionLinkvs Url.Actionoder gibt es nur zwei Möglichkeiten, dasselbe zu tun?

Wann sollte ich eins dem anderen vorziehen?

Antworten:


508

Ja, da gibt es einen Unterschied. Html.ActionLinkgeneriert ein <a href=".."></a>Tag, während Url.Actionnur eine URL zurückgegeben wird.

Zum Beispiel:

@Html.ActionLink("link text", "someaction", "somecontroller", new { id = "123" }, null)

erzeugt:

<a href="/somecontroller/someaction/123">link text</a>

und Url.Action("someaction", "somecontroller", new { id = "123" })erzeugt:

/somecontroller/someaction/123

Es gibt auch Html.Action , die eine untergeordnete Controller-Aktion ausführt.


14
@PankajUpadhyay, Sie sollten immer HTML- oder URL-Helfer verwenden, wenn Sie mit URLs in einer asp.net mvc-Anwendung arbeiten. Selbst wenn Sie Hundertstel von Links haben, verwenden Sie diese Html.ActionLink, um sie zu generieren. Versuchen Sie nicht, solche Mikrooptimierungen durchzuführen. Sie werden mit hässlichem Code in Ihren Ansichten enden.
Darin Dimitrov

2
dat bedeutet, dass ich Html.ActionLink () gegenüber Url.Action in allen Situationen bevorzugen sollte, wenn es um das Rendern eines Links geht. Übrigens, warum hat das offizielle Microsoft-Tutorial (MVC Music Store) auf der asp.net-Website Url.Action meistens verwendet, wenn ein Link benötigt wurde?
Pankaj Upadhyay

7
@PankajUpadhyay, verwenden Sie Html.ActionLink, wenn Sie ein Ankertag ( <a>) generieren müssen . Verwenden Sie Url.Action, wenn Sie nur eine URL generieren müssen (dies kann auch in einer Controller-Aktion verwendet werden).
Darin Dimitrov


3
Ich weiß, dass dies ein alter Beitrag ist, aber etwas aus Erfahrung gelernt. Url.Actionist viel leistungsfähiger als Html.ActionLink. Ich hatte eine Liste von 6.000 Artikeln mit 2 Html.ActionLinks. Das Rendern der Liste dauerte 6.600 ms. Ohne das Html.ActionLinksdauerte es 52ms. Die Benutzung Url.Actiondauerte 270 ms. Zugegeben, 6000 Artikel sind eine große Liste, aber ich dachte, ich würde sie zum späteren Nachschlagen hinzufügen.
Roberocity

42

Html.ActionLinkgeneriert <a href=".."></a>automatisch ein Tag.

Url.Action generiert nur eine URL.

Zum Beispiel:

@Html.ActionLink("link text", "actionName", "controllerName", new { id = "<id>" }, null)

erzeugt:

<a href="/controllerName/actionName/<id>">link text</a>

und

@Url.Action("actionName", "controllerName", new { id = "<id>" }) 

erzeugt:

/controllerName/actionName/<id>

Der beste Pluspunkt, den ich mag, ist die Verwendung Url.Action(...)

Sie erstellen selbst ein Ankertag, in dem Sie Ihren eigenen verknüpften Text auch mit einem anderen HTML-Tag problemlos festlegen können.

<a href="@Url.Action("actionName", "controllerName", new { id = "<id>" })">

   <img src="<ImageUrl>" style"width:<somewidth>;height:<someheight> />

   @Html.DisplayFor(model => model.<SomeModelField>)
</a>

12
<p>
    @Html.ActionLink("Create New", "Create")
</p>
@using (Html.BeginForm("Index", "Company", FormMethod.Get))
{
    <p>
        Find by Name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)
        <input type="submit" value="Search" />
        <input type="button" value="Clear" onclick="location.href='@Url.Action("Index","Company")'"/>
    </p>
}

Im obigen Beispiel können Sie sehen, dass ich, wenn ich speziell eine Schaltfläche zum Ausführen einer Aktion benötige, diese mit @ Url.Action ausführen muss. Wenn ich nur einen Link möchte, verwende ich @ Html.ActionLink. Der Punkt ist, wenn Sie ein Element (HTML) verwenden müssen, wobei die Aktions-URL verwendet wird.


10

@HTML.ActionLinkerzeugt a HTML anchor tag. Während @Url.Actiongeneriert ein URLfür Sie. Sie können es leicht verstehen, indem Sie;

// 1. <a href="https://stackoverflow.com/ControllerName/ActionMethod">Item Definition</a>
@HTML.ActionLink("Item Definition", "ActionMethod", "ControllerName")

// 2. /ControllerName/ActionMethod
@Url.Action("ActionMethod", "ControllerName")

// 3. <a href="https://stackoverflow.com/ControllerName/ActionMethod">Item Definition</a>
<a href="@Url.Action("ActionMethod", "ControllerName")"> Item Definition</a>

Beide Ansätze sind unterschiedlich und hängen ganz von Ihren Bedürfnissen ab.


2

Sie können Html.ActionLink einfach als Schaltfläche präsentieren, indem Sie den entsprechenden CSS-Stil verwenden. Zum Beispiel:

@Html.ActionLink("Save", "ActionMethod", "Controller", new { @class = "btn btn-primary" })

5
Dies scheint keine Antwort auf die ursprüngliche Frage zu geben, was der Unterschied zwischen HTML.ActionLink und Url.Action ist. Vielleicht sollten Sie einen Kommentar anstelle einer Antwort verwenden.
Fencer04

Ihre Antwort enthält nicht die ursprüngliche Anfrage.
Arsman Ahmad

0

Ich habe den folgenden Code verwendet, um einen Button zu erstellen, und er hat bei mir funktioniert.

<input type="button" value="PDF" onclick="location.href='@Url.Action("Export","tblOrder")'"/>

1
Ich denke, du musst die Frage noch einmal lesen. @Pankaj Upadhyay fragt ganz anders.
Arsman Ahmad
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.