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


304

Чи є різниця між HTML.ActionLinkvs Url.Actionабо вони є лише двома способами зробити те саме?

Коли я повинен віддавати перевагу одному перед іншим?

Відповіді:


508

Так, є різниця. Html.ActionLinkстворює <a href=".."></a>тег, тоді як Url.Actionповертає лише URL-адресу.

Наприклад:

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

генерує:

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

і Url.Action("someaction", "somecontroller", new { id = "123" })генерує:

/somecontroller/someaction/123

Є також Html.Action, який виконує дію контролера.


14
@PankajUpadhyay, ви завжди повинні використовувати html або url-помічники при роботі з URL-адресами в додатку asp.net mvc. Навіть якщо у вас є соті посилання, використовуйте Html.ActionLinkдля їх створення. Не намагайтеся робити такі мікрооптимізації. У вас виявиться некрасивий код у ваших поглядах.
Дарин Димитров

2
dat означає, що я повинен віддавати перевагу Html.ActionLink () над Url.Action у всіх ситуаціях, коли рендеринг посилання стосується. BTW, тоді чому офіційний підручник Microsoft (MVC Music Store) на веб-сайті asp.net використовував Url.Action більшість разів, коли потрібне посилання.
Pankaj Upadhyay

7
@PankajUpadhyay, використовуйте Html.ActionLink, коли вам потрібно створити якірний тег ( <a>). Використовуйте Url.Action, коли вам потрібно генерувати лише URL-адресу (це також може бути використане в дії контролера).
Дарин Димитров

3
@Shimmy, ви можете прочитати про це тут: haacked.com/archive/2009/11/17/aspnetmvc2-render-action.aspx
Димитров

3
Я знаю, що це стара публікація, але щось вивчене на досвіді. Url.Actionнабагато ефективніше, ніж Html.ActionLink. У мене був список з 6000 предметів, у яких було 2 Html.ActionLinks. Щоб переглянути список, було потрібно 6 600 мільйонів. Без Html.ActionLinksцього пройшло 52мс. Використовуючи Url.Actionце зайняло 270 мс. Звичайно, 6000 предметів - це великий список, але я подумав, що я додам його для подальшого ознайомлення.
roberobity

42

Html.ActionLink<a href=".."></a>автоматично генерує тег.

Url.Action генерує лише URL-адресу.

Наприклад:

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

генерує:

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

і

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

генерує:

/controllerName/actionName/<id>

Найкращий плюс, який мені подобається - це використання Url.Action(...)

Ви створюєте тег прив’язки самостійно, де ви можете легко встановити власний пов'язаний текст, навіть за допомогою іншого тегу html.

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

   <img src="<ImageUrl>" style"width:<somewidth>;height:<someheight> />

   @Html.DisplayFor(model => model.<SomeModelField>)
</a>

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

У наведеному вище прикладі ви бачите, що якщо мені спеціально потрібна кнопка, щоб виконати якусь дію, я повинен це зробити за допомогою @ Url.Action, тоді як якщо я просто хочу посилання, я буду використовувати @ Html.ActionLink. Справа в тому, коли вам доведеться використовувати якийсь елемент (HTML) з URL-адресом дії.


10

@HTML.ActionLinkпороджує a HTML anchor tag. Поки @Url.Actionстворює URLдля вас. Ви можете легко зрозуміти це;

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

Обидва ці підходи різні, і це повністю залежить від вашої потреби.


2

Ви можете легко представити Html.ActionLink як кнопку, використовуючи відповідний стиль CSS. Наприклад:

@Html.ActionLink("Save", "ActionMethod", "Controller", new { @class = "btn btn-primary" })

5
Схоже, це не відповідає на оригінальний запитання про те, чим відрізняється HTML.ActionLink від Url.Action. Можливо, вам слід використовувати коментар замість відповіді.
Fencer04

Ваша відповідь не містить оригінального запиту.
Арсман Ахмад

0

Я використовував код нижче, щоб створити кнопку, і він працював на мене.

<input type="button" value="PDF" onclick="location.href='@Url.Action("Export","tblOrder")'"/>

1
Я думаю, вам доведеться прочитати питання ще раз. @Pankaj Upadhyay запитує зовсім інше.
Арсман Ахмад
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.