HTML.ActionLink против Url.Action в ASP.NET Razor

304

Есть ли разница между HTML.ActionLink против 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 helpers при работе с url в приложении asp.net mvc. Даже если у вас есть сотые ссылки, используйте их Html.ActionLinkдля генерации. Не пытайтесь делать такие микрооптимизации. В результате вы получите некрасивый код в своих представлениях.
Дарин Димитров
2
dat означает, что я должен предпочесть Html.ActionLink (), а не Url.Action во всех ситуациях, связанных с отображением ссылки. Кстати, тогда почему официальный учебник Microsoft (музыкальный магазин MVC) на сайте asp.net использовал Url.Action чаще всего всякий раз, когда требовалась ссылка.
Панкадж Упадхяй
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. На рендеринг списка ушло 6600 мс. Без Html.ActionLinksэтого прошло 52 мс. Использование Url.Actionзаняло 270 мс. Конечно, 6000 предметов - это большой список, но я подумал, что добавлю его для дальнейшего использования.
roberocity
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генерирует 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" })
Altair
источник
5
Похоже, это не ответ на оригинальный вопрос о том, в чем разница между HTML.ActionLink и Url.Action. Возможно, вам следует использовать комментарий вместо ответа.
Fencer04
Ваш ответ не интересует исходный запрос.
Арсман Ахмад
0

Я использовал код ниже, чтобы создать кнопку, и это сработало для меня.

<input type="button" value="PDF" onclick="location.href='@Url.Action("Export","tblOrder")'"/>
Аньель Гоплани
источник
1
Я думаю, вы должны прочитать вопрос снова. @Pankaj Upadhyay просит совершенно другую вещь.
Арсман Ахмад