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?

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.


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

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.


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.


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" })

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")'"/>

1
Je pense que vous devez relire la question. @Pankaj Upadhyay demande une chose totalement différente.
Arsman Ahmad
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.