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

304

Czy jest jakaś różnica między HTML.ActionLinkvs Url.Actionczy są to tylko dwa sposoby robienia tego samego?

Kiedy powinienem preferować jeden od drugiego?

Pankaj Upadhyay
źródło

Odpowiedzi:

508

Tak, jest różnica. Html.ActionLinkgeneruje <a href=".."></a>tag, podczas gdy Url.Actionzwraca tylko adres URL.

Na przykład:

@Html.ActionLink("link text", "someaction", "somecontroller", new { id = "123" }, null)

generuje:

<a href="/somecontroller/someaction/123">link text</a>

i Url.Action("someaction", "somecontroller", new { id = "123" })generuje:

/somecontroller/someaction/123

Istnieje również Html.Action, która wykonuje akcję kontrolera podrzędnego.

Darin Dimitrov
źródło
14
@PankajUpadhyay, powinieneś zawsze używać pomocy HTML lub URL, kiedy masz do czynienia z adresami URL w aplikacji asp.net mvc. Nawet jeśli masz setne linki, użyj Html.ActionLinkich , aby je wygenerować. Nie próbuj robić takich mikrooptymalizacji. Skończysz z brzydkim kodem w swoich widokach.
Darin Dimitrov
2
dat oznacza, że ​​wolę Html.ActionLink () niż Url.Action we wszystkich sytuacjach, w których dotyczy renderowania łącza. BTW, to dlaczego oficjalny samouczek Microsoft (MVC Music Store) na stronie asp.net używał Url.Action większość razy, gdy potrzebny był link.
Pankaj Upadhyay
7
@PankajUpadhyay, użyj Html.ActionLink, gdy musisz wygenerować tag zakotwiczenia ( <a>). Użyj Url.Action, jeśli potrzebujesz wygenerować tylko adres URL (może to również zostać użyte w akcji kontrolera).
Darin Dimitrov
3
@Shimmy, możesz przeczytać o tym tutaj: haacked.com/archive/2009/11/17/aspnetmvc2-render-action.aspx
Darin Dimitrov
3
Wiem, że to stary post, ale czegoś się nauczyłem z doświadczenia. Url.Actionjest znacznie bardziej wydajny niż Html.ActionLink. Miałem listę 6000 przedmiotów, które miały 2 Html.ActionLinks. Renderowanie listy zajęło 6600 ms. Bez Html.ActionLinkstego zajęło 52 ms. Korzystanie z Url.Actionniego zajęło 270 ms. To prawda, 6000 pozycji to duża lista, ale pomyślałem, że dodam ją na przyszłość.
roberocity
42

Html.ActionLink generuje <a href=".."></a>automatycznie tag.

Url.Action generuje tylko adres URL.

Na przykład:

@Html.ActionLink("link text", "actionName", "controllerName", new { id = "<id>" }, null)

generuje:

<a href="/controllerName/actionName/<id>">link text</a>

i

@Url.Action("actionName", "controllerName", new { id = "<id>" }) 

generuje:

/controllerName/actionName/<id>

Najlepszy punkt plus, który lubię, to używanie Url.Action(...)

Sam tworzysz tag zakotwiczenia, w którym możesz łatwo ustawić własny linkowany tekst, nawet przy użyciu innego tagu 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
źródło
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>
}

W powyższym przykładzie widać, że jeśli konkretnie potrzebuję przycisku, aby wykonać jakąś akcję, muszę to zrobić za pomocą @ Url.Action, natomiast jeśli chcę tylko link, użyję @ Html.ActionLink. Chodzi o to, że musisz użyć jakiegoś elementu (HTML) z adresem URL akcji.

Rohit Singh
źródło
10

@HTML.ActionLinkgeneruje HTML anchor tag. Podczas gdy @Url.Actiongeneruje URLdla ciebie. Możesz to łatwo zrozumieć poprzez;

// 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>

Oba te podejścia są różne i zależy to całkowicie od twoich potrzeb.

Arsman Ahmad
źródło
2

Możesz łatwo przedstawić Html.ActionLink jako przycisk, używając odpowiedniego stylu CSS. Na przykład:

@Html.ActionLink("Save", "ActionMethod", "Controller", new { @class = "btn btn-primary" })
Altair
źródło
5
To nie wydaje się odpowiadać na oryginalne pytanie, jaka jest różnica między HTML.ActionLink a Url.Action. Być może powinieneś użyć komentarza zamiast odpowiedzi.
Fencer04,
Twoja odpowiedź nie zawiera oryginalnego zapytania.
Arsman Ahmad
0

Użyłem poniższego kodu, aby utworzyć Button i zadziałało to dla mnie.

<input type="button" value="PDF" onclick="location.href='@Url.Action("Export","tblOrder")'"/>
Aneel Goplani
źródło
1
Myślę, że musisz przeczytać pytanie ponownie. @Pankaj Upadhyay pyta zupełnie inaczej.
Arsman Ahmad