Existe alguma diferença entre HTML.ActionLink
e Url.Action
ou são apenas duas formas de fazer a mesma coisa?
Quando devo preferir um em vez do outro?
Sim, há uma diferença. O Html.ActionLink
gera um <a href="..."></a>
tag enquanto Url.Action
devolve apenas um url.
Por exemplo:
@Html.ActionLink("link text", "someaction", "somecontroller", new { id = "123" }, null)
gera:
<a href="/somecontroller/someaction/123">link text</a>
e Url.Action("someaction", "somecontroller", novo { id = "123" })
gera:
/somecontroller/someaction/123
Há também Html.Action que executa uma ação do controlador infantil.
O Html.ActionLink
gera um <a href="..."></a>
tag automaticamente.
O 'url.Action' gera apenas um url.
Por exemplo:
@Html.ActionLink("link text", "actionName", "controllerName", new { id = "<id>" }, null)
gera:
<a href="/controllerName/actionName/<id>">link text</a>
e
@Url.Action("actionName", "controllerName", new { id = "<id>" })
gera:
/controllerName/actionName/<id>
O melhor ponto positivo que eu gosto é utilizar Url.Action(...)
Você está criando a sua própria tag de âncora onde você pode definir facilmente seu próprio texto vinculado, mesmo com alguma outra tag 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>
}
No exemplo acima você pode ver que se eu precisar especificamente de um botão para fazer alguma ação, eu tenho que fazê-lo com @Url.Action enquanto que se eu quiser apenas um link eu usarei @Html.ActionLink. O ponto é quando você tem que usar algum elemento(HTML) com action url é usado.