Existe alguma diferença entre HTML.ActionLinkvs Url.Actionou eles são apenas duas maneiras de fazer a mesma coisa?
Quando devo preferir um ao outro?
Existe alguma diferença entre HTML.ActionLinkvs Url.Actionou eles são apenas duas maneiras de fazer a mesma coisa?
Quando devo preferir um ao outro?
Respostas:
Sim, há uma diferença. Html.ActionLinkgera uma <a href=".."></a>tag enquanto Url.Actionretorna 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.ActionLinkslevou 52ms. Usá- Url.Actionlo levou 270ms. É verdade que 6000 itens são uma lista grande, mas achei que eu a adicionaria para referência futura.
Html.ActionLinkgera 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.ActionLinkgera um HTML anchor tag. Enquanto @Url.Actiongera um URLpara 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.ActionLinkpara gerá-los. Não tente fazer essas micro otimizações. Você terminará com um código feio em suas visualizações.