Czy jest jakaś różnica między HTML.ActionLink
vs Url.Action
czy są to tylko dwa sposoby robienia tego samego?
Kiedy powinienem preferować jeden od drugiego?
Czy jest jakaś różnica między HTML.ActionLink
vs Url.Action
czy są to tylko dwa sposoby robienia tego samego?
Kiedy powinienem preferować jeden od drugiego?
Odpowiedzi:
Tak, jest różnica. Html.ActionLink
generuje <a href=".."></a>
tag, podczas gdy Url.Action
zwraca 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.
<a>
). Użyj Url.Action, jeśli potrzebujesz wygenerować tylko adres URL (może to również zostać użyte w akcji kontrolera).
Url.Action
jest 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.ActionLinks
tego zajęło 52 ms. Korzystanie z Url.Action
niego zajęło 270 ms. To prawda, 6000 pozycji to duża lista, ale pomyślałem, że dodam ją na przyszłość.
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>
<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.
@HTML.ActionLink
generuje HTML anchor tag
. Podczas gdy @Url.Action
generuje URL
dla 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.
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" })
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")'"/>
Html.ActionLink
ich , aby je wygenerować. Nie próbuj robić takich mikrooptymalizacji. Skończysz z brzydkim kodem w swoich widokach.