HTML.ActionLink vs Url.Action no ASP.NET Razor

304

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?

Pankaj Upadhyay
fonte

Respostas:

508

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.

Darin Dimitrov
fonte
14
@PankajUpadhyay, você sempre deve usar auxiliares de html ou url ao lidar com URLs em um aplicativo asp.net mvc. Mesmo se você tiver centésimos de links, use Html.ActionLinkpara gerá-los. Não tente fazer essas micro otimizações. Você terminará com um código feio em suas visualizações.
precisa
2
dat significa que devo preferir Html.ActionLink () sobre Url.Action em todas as situações ao renderizar um link. BTW, então por que o tutorial oficial da Microsoft (MVC Music Store) no site asp.net usava o Url.Action na maioria das vezes sempre que um link era necessário.
Pankaj Upadhyay 10/10
7
@PankajUpadhyay, use Html.ActionLink quando precisar gerar uma tag de âncora ( <a>). Use Url.Action quando precisar gerar apenas um URL (isso também pode ser usado em uma ação do controlador).
Darin Dimitrov
3
@Shimmy, você pode ler sobre isso aqui: haacked.com/archive/2009/11/17/aspnetmvc2-render-action.aspx
Darin Dimitrov
3
Eu sei que este é um post antigo, mas algo aprendido com a experiência. 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.
21418 roberocity
42

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>
Pranav Labhe
fonte
12
<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.

Rohit Singh
fonte
10

@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.

Arsman Ahmad
fonte
2

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" })
Altair
fonte
5
Isso não parece responder à pergunta original sobre qual é a diferença entre HTML.ActionLink e Url.Action. Talvez você deva usar um comentário em vez de uma resposta.
precisa saber é o seguinte
Sua resposta não diverte a consulta original.
Arsman Ahmad 4/04
0

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")'"/>
Aneel Goplani
fonte
1
Eu acho que você precisa ler a pergunta novamente. @Pankaj Upadhyay está pedindo uma coisa totalmente diferente.
Arsman Ahmad 04/04