ASP.NET Razor中的HTML.ActionLink和Url.Action有什么区别?

347

HTML.ActionLinkUrl.Action是否有区别,还是它们只是完成同一件事的两种不同方式?

在什么情况下应该优先选择其中一种?

6个回答

575

是的,有区别。 Html.ActionLink 生成一个 <a href=".."></a> 标签,而 Url.Action 只返回一个网址。

例如:

@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,可以执行子控制器操作。


17
在ASP.NET MVC应用程序中处理URL时,您应始终使用HTML或URL助手。即使有成百上千个链接,也应使用Html.ActionLink来生成它们。不要试图进行微小的优化,否则您的视图代码将变得丑陋。 - Darin Dimitrov
2
这意味着无论何时需要渲染一个链接,我都应该更喜欢使用Html.ActionLink()而不是Url.Action。顺便问一下,为什么微软官方的asp.net网站上的MVC音乐商店教程大多数情况下都使用Url.Action来创建链接? - Pankaj Upadhyay
7
在需要生成锚标签(<a>)时,请使用Html.ActionLink。在只需要生成URL时(这也可以在控制器操作中使用),请使用Url.Action。 - Darin Dimitrov
5
@Shimmy,你可以在这里阅读相关内容:http://haacked.com/archive/2009/11/17/aspnetmvc2-render-action.aspx。 - Darin Dimitrov
6
我知道这是一篇旧帖子,但是有点从经验中学到了。Url.ActionHtml.ActionLink性能更好。我有一个列表包含6,000个项目,其中每个项目都有2个Html.ActionLinks。渲染该列表需要6,600ms的时间。如果去掉Html.ActionLinks,只需要52ms的时间。使用Url.Action花费了270ms的时间。当然,6,000个项目是一个很大的列表,但是我认为这可以作为以后参考的依据。 - Rob Sutherland
显示剩余2条评论

50

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>

and
@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>

14

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

这两种方法都不同,完全取决于您的需求。


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。 重点是当你需要使用带有动作URL的某些元素(HTML)时使用它。

5

您可以使用适当的CSS样式将Html.ActionLink轻松呈现为按钮。例如:

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

6
这似乎没有回答原来的问题,即HTML.ActionLink与Url.Action之间的区别。也许您应该使用评论而不是答案。 - Fencer04
你的回答并没有解决原始问题。 - Arsman Ahmad

0
我使用下面的代码创建了一个按钮,它对我有效。
<input type="button" value="PDF" onclick="location.href='@Url.Action("Export","tblOrder")'"/>

1
我认为你需要再读一遍问题。@Pankaj Upadhyay 正在询问完全不同的事情。 - Arsman Ahmad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接