Есть ли разница между 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, который выполняет действие дочернего контроллера.
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-анкерный тег
. Пока @ Url.Action
генерирует URL
для вас. Вы можете легко понять это по ;
// 1. <a href="/ControllerName/ActionMethod">Item Definition</a>
@HTML.ActionLink("Item Definition", "ActionMethod", "ControllerName")
// 2. /ControllerName/ActionMethod
@Url.Action("ActionMethod", "ControllerName")
// 3. <a href="/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")'"/>