Есть ли разница между HTML.ActionLink
против Url.Action
или они просто два способа сделать то же самое?
Когда я должен предпочесть одно другому?
Есть ли разница между HTML.ActionLink
против Url.Action
или они просто два способа сделать то же самое?
Когда я должен предпочесть одно другому?
Ответы:
Да, есть разница. 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, который выполняет дочернее действие контроллера.
<a>
). Используйте Url.Action, когда вам нужно сгенерировать только URL (это также может быть использовано в действии контроллера).
Url.Action
гораздо эффективнее, чем Html.ActionLink
. У меня был список из 6000 предметов, в которых было 2 Html.ActionLinks
. На рендеринг списка ушло 6600 мс. Без Html.ActionLinks
этого прошло 52 мс. Использование Url.Action
заняло 270 мс. Конечно, 6000 предметов - это большой список, но я подумал, что добавлю его для дальнейшего использования.
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>
<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-адресом действия.
@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>
Оба эти подхода различны, и это полностью зависит от ваших потребностей.
Вы можете легко представить Html.ActionLink в виде кнопки, используя соответствующий стиль CSS. Например:
@Html.ActionLink("Save", "ActionMethod", "Controller", new { @class = "btn btn-primary" })
Я использовал код ниже, чтобы создать кнопку, и это сработало для меня.
<input type="button" value="PDF" onclick="location.href='@Url.Action("Export","tblOrder")'"/>
Html.ActionLink
для генерации. Не пытайтесь делать такие микрооптимизации. В результате вы получите некрасивый код в своих представлениях.