¿Hay alguna diferencia entre HTML.ActionLink
vs Url.Action
o son solo dos formas de hacer lo mismo?
¿Cuándo debería preferir uno sobre el otro?
¿Hay alguna diferencia entre HTML.ActionLink
vs Url.Action
o son solo dos formas de hacer lo mismo?
¿Cuándo debería preferir uno sobre el otro?
Respuestas:
Sí, hay una diferencia. Html.ActionLink
genera una <a href=".."></a>
etiqueta mientras que Url.Action
solo 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.
<a>
). Use Url.Action cuando necesite generar solo una url (esto también podría usarse en una acción de controlador).
Url.Action
es 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.ActionLinks
tomó 52ms. Usarlo Url.Action
tomó 270 ms. Por supuesto, 6000 artículos es una lista grande, pero pensé que lo agregaría para referencia futura.
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>
<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.
@HTML.ActionLink
genera a HTML anchor tag
. Mientras @Url.Action
genera un URL
para 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.
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" })
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")'"/>
Html.ActionLink
para generarlos. No intentes hacer tales micro optimizaciones. Terminarás con un código feo en tus vistas.