¿Hay alguna diferencia entre HTML.ActionLink
y Url.Action
o son sólo dos formas de hacer lo mismo?
¿Cuándo debo preferir uno sobre el otro?
Sí, hay una diferencia. Html.ActionLink
genera una etiqueta <a href=".."></a>mientras que
Url.Action` devuelve sólo 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 existe Html.Action que ejecuta una acción de controlador hijo.
Html.ActionLink
genera una etiqueta <a href=".."></a>
automáticamente.
Url.Action
genera sólo 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 a favor que me gusta es usar Url.Action(...)
Usted está creando la etiqueta de anclaje por su cuenta donde se puede establecer 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 puedes ver que si necesito específicamente un botón para hacer alguna acción, tengo que hacerlo con @Url.Action mientras que si sólo quiero un enlace usaré @Html.ActionLink. La cuestión es que cuando se tiene que utilizar algún elemento(HTML) con acción se utiliza url.