Existe alguma diferença entre HTML.ActionLink
vs Url.Action
ou eles são apenas duas maneiras de fazer a mesma coisa?
Quando devo preferir um ao outro?
Existe alguma diferença entre HTML.ActionLink
vs Url.Action
ou eles são apenas duas maneiras de fazer a mesma coisa?
Quando devo preferir um ao outro?
Respostas:
Sim, há uma diferença. Html.ActionLink
gera uma <a href=".."></a>
tag enquanto Url.Action
retorna 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", new { id = "123" })
gera:
/somecontroller/someaction/123
Há também Html.Action que executa uma ação de controlador filho.
<a>
). Use Url.Action quando precisar gerar apenas um URL (isso também pode ser usado em uma ação do controlador).
Url.Action
é muito mais performativo que Html.ActionLink
. Eu tinha uma lista de 6.000 itens que tinham 2 Html.ActionLinks
. Foram necessários 6.600ms para renderizar a lista. Sem o Html.ActionLinks
levou 52ms. Usá- Url.Action
lo levou 270ms. É verdade que 6000 itens são uma lista grande, mas achei que eu a adicionaria para referência futura.
Html.ActionLink
gera uma <a href=".."></a>
tag automaticamente.
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 é de usar Url.Action(...)
Você está criando uma marca de âncora por conta própria, onde é possível definir seu próprio texto vinculado facilmente, mesmo com alguma outra marca 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 executar alguma ação, devo fazê-lo com @ Url.Action, enquanto que, se eu quiser apenas um link, utilizarei @ Html.ActionLink. O ponto é quando você precisa usar algum elemento (HTML) com o URL de ação.
@HTML.ActionLink
gera um HTML anchor tag
. Enquanto @Url.Action
gera um URL
para você. Você pode entender isso facilmente;
// 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>
Ambas as abordagens são diferentes e depende totalmente da sua necessidade.
Você pode apresentar facilmente Html.ActionLink como um botão usando o estilo CSS apropriado. Por exemplo:
@Html.ActionLink("Save", "ActionMethod", "Controller", new { @class = "btn btn-primary" })
Usei o código abaixo para criar um botão e funcionou para mim.
<input type="button" value="PDF" onclick="location.href='@Url.Action("Export","tblOrder")'"/>
Html.ActionLink
para gerá-los. Não tente fazer essas micro otimizações. Você terminará com um código feio em suas visualizações.