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?

Pankaj Upadhyay
quelle

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.

Darin Dimitrov
quelle
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
@ Shimmy, Sie können darüber hier lesen: haacked.com/archive/2009/11/17/aspnetmvc2-render-action.aspx
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>
Pranav Labhe
quelle
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.

Rohit Singh
quelle
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.

Arsman Ahmad
quelle
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" })
Altair
quelle
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")'"/>
Aneel Goplani
quelle
1
Ich denke, du musst die Frage noch einmal lesen. @Pankaj Upadhyay fragt ganz anders.
Arsman Ahmad