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

304

¿Hay alguna diferencia entre HTML.ActionLink vs Url.Actiono son solo dos formas de hacer lo mismo?

¿Cuándo debería preferir uno sobre el otro?

Pankaj Upadhyay
fuente

Respuestas:

508

Sí, hay una diferencia. Html.ActionLinkgenera una <a href=".."></a>etiqueta mientras que Url.Actionsolo devuelve una url.

Por ejemplo:

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

genera:

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

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

/somecontroller/someaction/123

También hay Html.Action que ejecuta una acción de controlador secundario.

Darin Dimitrov
fuente
14
@PankajUpadhyay, siempre debe usar html o url helpers cuando trabaje con urls en una aplicación asp.net mvc. Incluso si tiene centésimas de enlaces, úselo Html.ActionLinkpara generarlos. No intentes hacer tales micro optimizaciones. Terminarás con un código feo en tus vistas.
Darin Dimitrov
2
dat significa que debería preferir Html.ActionLink () sobre Url.Action en todas las situaciones cuando se trata de representar un enlace. Por cierto, entonces ¿por qué el tutorial oficial de Microsoft (MVC Music Store) en el sitio web asp.net usaba Url.Action la mayoría de las veces cuando se necesitaba un enlace?
Pankaj Upadhyay
77
@PankajUpadhyay, use Html.ActionLink cuando necesite generar una etiqueta de anclaje ( <a>). Use Url.Action cuando necesite generar solo una url (esto también podría usarse en una acción de controlador).
Darin Dimitrov
3
@Shimmy, puedes leer sobre esto aquí: haacked.com/archive/2009/11/17/aspnetmvc2-render-action.aspx
Darin Dimitrov
3
Sé que este es un post antiguo, pero algo aprendido de la experiencia. Url.Actiones mucho más performato que Html.ActionLink. Tenía una lista de 6,000 artículos que tenían 2 Html.ActionLinks. Se necesitaron 6.600 ms para representar la lista. Sin el Html.ActionLinkstomó 52ms. Usarlo Url.Actiontomó 270 ms. Por supuesto, 6000 artículos es una lista grande, pero pensé que lo agregaría para referencia futura.
roberocity
42

Html.ActionLink genera un <a href=".."></a> etiqueta automáticamente.

Url.Action genera solo una url.

Por ejemplo:

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

genera:

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

y

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

genera:

/controllerName/actionName/<id>

El mejor punto positivo que me gusta es usar Url.Action(...)

Está creando una etiqueta de anclaje por su cuenta donde puede configurar su propio texto vinculado fácilmente incluso con alguna otra etiqueta 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
fuente
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>
}

En el ejemplo anterior, puede ver que si necesito específicamente un botón para realizar alguna acción, tengo que hacerlo con @ Url.Action, mientras que si solo quiero un enlace, usaré @ Html.ActionLink. El punto es cuando debe usar algún elemento (HTML) con la acción url.

Rohit Singh
fuente
10

@HTML.ActionLinkgenera a HTML anchor tag. Mientras @Url.Actiongenera un URLpara ti. Puedes entenderlo fácilmente;

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

Ambos enfoques son diferentes y depende totalmente de su necesidad.

Arsman Ahmad
fuente
2

Puede presentar fácilmente Html.ActionLink como un botón utilizando el estilo CSS apropiado. Por ejemplo:

@Html.ActionLink("Save", "ActionMethod", "Controller", new { @class = "btn btn-primary" })
Altair
fuente
55
Esto no parece responder a la pregunta original sobre cuál es la diferencia entre HTML.ActionLink y Url.Action. Quizás deberías usar un comentario en lugar de una respuesta.
Fencer04
Su respuesta no entretiene la consulta original.
Arsman Ahmad
0

Usé el siguiente código para crear un botón y funcionó para mí.

<input type="button" value="PDF" onclick="location.href='@Url.Action("Export","tblOrder")'"/>
Aneel Goplani
fuente
1
Creo que tienes que volver a leer la pregunta. @Pankaj Upadhyay pregunta algo totalmente diferente.
Arsman Ahmad