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

304

Y a-t-il une différence entre HTML.ActionLinkvs Url.Actionou ce ne sont que deux façons de faire la même chose?

Quand devrais-je préférer l'un à l'autre?

Pankaj Upadhyay
la source

Réponses:

508

Oui, il y a une différence. Html.ActionLinkgénère une <a href=".."></a>balise alors qu'elle Url.Actionne renvoie qu'une URL.

Par exemple:

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

génère:

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

et Url.Action("someaction", "somecontroller", new { id = "123" })génère:

/somecontroller/someaction/123

Il existe également Html.Action qui exécute une action de contrôleur enfant.

Darin Dimitrov
la source
14
@PankajUpadhyay, vous devez toujours utiliser des aides html ou url lors du traitement des URL dans une application mvc asp.net. Même si vous avez des centièmes de liens, utilisez-les Html.ActionLinkpour les générer. N'essayez pas de faire de telles micro-optimisations. Vous vous retrouverez avec du code laid dans vos vues.
Darin Dimitrov
2
dat signifie que je devrais préférer Html.ActionLink () à Url.Action dans toutes les situations lors du rendu d'un lien. BTW, alors pourquoi le didacticiel officiel de Microsoft (MVC Music Store) sur le site Web asp.net a-t-il utilisé Url.Action la plupart du temps chaque fois qu'un lien était nécessaire.
Pankaj Upadhyay
7
@PankajUpadhyay, utilisez Html.ActionLink lorsque vous avez besoin pour générer une balise d'ancrage ( <a>). Utilisez Url.Action lorsque vous devez générer uniquement une URL (cela peut également être utilisé dans une action de contrôleur).
Darin Dimitrov
3
@Shimmy, vous pouvez en lire plus ici: haacked.com/archive/2009/11/17/aspnetmvc2-render-action.aspx
Darin Dimitrov
3
Je sais que c'est un ancien poste, mais quelque chose a appris de l'expérience. Url.Actionest beaucoup plus performant que Html.ActionLink. J'avais une liste de 6 000 articles qui en avaient 2 Html.ActionLinks. Il a fallu 6 600 ms pour rendre la liste. Sans l' Html.ActionLinksil a fallu 52ms. Url.ActionSon utilisation a pris 270 ms. Certes, 6000 articles sont une grande liste, mais j'ai pensé l'ajouter pour référence future.
roberocity
42

Html.ActionLinkgénère une <a href=".."></a>balise automatiquement.

Url.Action génère uniquement une URL.

Par exemple:

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

génère:

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

et

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

génère:

/controllerName/actionName/<id>

Le meilleur point positif que j'aime est d'utiliser Url.Action(...)

Vous créez une balise d'ancrage par vous-même où vous pouvez définir votre propre texte lié facilement, même avec une autre balise html.

<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
la source
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>
}

Dans l'exemple ci-dessus, vous pouvez voir que si j'ai spécifiquement besoin d'un bouton pour effectuer une action, je dois le faire avec @ Url.Action alors que si je veux juste un lien, j'utiliserai @ Html.ActionLink. Le point est quand vous devez utiliser un élément (HTML) avec une action URL est utilisée.

Rohit Singh
la source
10

@HTML.ActionLinkgénère un HTML anchor tag. Alors que @Url.Actiongénère un URLpour vous. Vous pouvez facilement le comprendre par;

// 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>

Ces deux approches sont différentes et cela dépend totalement de vos besoins.

Arsman Ahmad
la source
2

Vous pouvez facilement présenter Html.ActionLink sous la forme d'un bouton en utilisant le style CSS approprié. Par exemple:

@Html.ActionLink("Save", "ActionMethod", "Controller", new { @class = "btn btn-primary" })
Altair
la source
5
Cela ne semble pas répondre à la question d'origine quant à la différence entre HTML.ActionLink et Url.Action. Vous devriez peut-être utiliser un commentaire au lieu d'une réponse.
Fencer04
Votre réponse ne contient pas la requête d'origine.
Arsman Ahmad
0

J'ai utilisé le code ci-dessous pour créer un bouton et cela a fonctionné pour moi.

<input type="button" value="PDF" onclick="location.href='@Url.Action("Export","tblOrder")'"/>
Aneel Goplani
la source
1
Je pense que vous devez relire la question. @Pankaj Upadhyay demande une chose totalement différente.
Arsman Ahmad