使用 Html.ActionLink 在不同的控制器上调用动作
Posted
技术标签:
【中文标题】使用 Html.ActionLink 在不同的控制器上调用动作【英文标题】:Using Html.ActionLink to call action on different controller 【发布时间】:2009-04-22 11:35:55 【问题描述】:我正在尝试使用 ActionLink
在控制器之间导航。我会用一个例子来说明我的问题。
我在 Hat 控制器的 Index 视图中,我正在尝试使用下面的代码来创建指向 Product 控制器的 Details 操作的链接。
<%= html.ActionLink("Details", "Details", "Product", new id=item.ID ) %>
这不是在 Product 控制器上创建一个到 Details 的链接,而是在 Hat 控制器下生成一个到 Details 操作的链接,并在它的末尾附加一个 Length 参数:
Hat/Details/9?Length=7
由于这个问题,我无法使用HTML.ActionLink
在控制器之间切换。如果您能指出我做错了什么,我将不胜感激。谢谢
PS:我使用的是MVC自带的默认路由设置
routes.MapRoute("Default", "controller/action/id",
new controller = "Home", action = "Index", id = "" );
【问题讨论】:
【参考方案1】:你想要的是这个重载:
//linkText, actionName, controllerName, routeValues, htmlAttributes
<%=Html.ActionLink("Details", "Details",
"Product", new id = item.ID, null) %>
【讨论】:
你能解释一下为什么这种特殊的重载有效而 korki 的无效吗?将 htmlAttributes 设置为 null 对链接的路由有何影响? 这是因为如果你使用其他参数,它假定第三个参数是路由值,第四个参数是 html 属性。添加第 5 个参数会强制该方法使用正确的重载。在智能感知中浏览重载,这将更有意义。 ActionLink 的重载真的很笨拙。接受 'object routeValues' 而不是 RouteValueCollection 的全部意义在于减少输入量。但是,您最终不得不输入一个额外的空值。不直观且适得其反... 我同意,重载参数设计得很糟糕。我认为这是一个最长的错误。我真的不得不盯着第 9 次智能感知来理解我使用了错误的签名 对于未来的读者,如果你遇到这个问题并且你正在尝试添加一个 css 样式,那么这是正确的重载。 @Html.ActionLink("MyText", "MyAction", "MyController", null, new @class= "myClass" )【参考方案2】:使用该参数,您将触发错误的重载函数/方法。
什么对我有用:
<%= Html.ActionLink("Details", "Details", "Product", new id=item.ID , null) %>
它触发 HtmlHelper.ActionLink(string linkText, string actionName, string controllerName, object routeValues, object htmlAttributes)
我正在使用 MVC 4。
欢呼!
【讨论】:
您的代码行不会触发您提到的重载,而是 HtmlHelper.ActionLink(string linkText, string actionName, object routeValues, object htmlAttributes)。这产生了 OP 试图避免的相同结果。您需要添加一个额外的空参数。 谢谢蒂莫克,错过了吗?【参考方案3】:为了清楚起见,我建议使用命名参数编写这些帮助程序,如下所示:
@Html.ActionLink(
linkText: "Details",
actionName: "Details",
controllerName: "Product",
routeValues: new
id = item.ID
,
htmlAttributes: null
)
【讨论】:
截至 2019 年,此功能由 JetBrains 在 ReSharper 中实现。对于这种情况,它实际上非常有帮助。【参考方案4】:如果您使用 MVC Futures 程序集(我强烈推荐),那么您可以在创建 ActionLink 时使用泛型和 lambda 来构造路由:
<%=Html.ActionLink<Product>(c => c.Action( o.Value ), "Details" ) %>
您可以在此处获取期货程序集:http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471
【讨论】:
感谢您的实际链接 - 正在尝试找到它! 对此要小心,因为它没有包含在 MVC2 中。原因是动作不一定是方法(我同意这一点,但迁移会很痛苦,因为我们已经使用通用方法一段时间了)。这是关于为什么它没有被保留在 2 中的完整文章:haacked.com/archive/2008/08/29/…【参考方案5】:你打错了 ActionLink 的过载。试试这个吧。
<%= Html.ActionLink("Details", "Details", "Product", new RouteValueDictionary(new id=item.ID )) %>
【讨论】:
【参考方案6】:试一试,效果很好
<%:Html.ActionLink("Details","Details","Product", new id=item.dateID ,null)%>
【讨论】:
【参考方案7】:另一种解决方案是使用Url
辅助对象来设置<a>
标记的href
属性,例如:
<a href="@Url.Action("Details", "Product",new id=item.ID ) )">Details</a>
【讨论】:
【参考方案8】:请注意,详细信息是“产品”文件夹下的“查看”页面。
ProductId 是表的主键。这是 Index.cshtml 中的行
@Html.ActionLink("Details", "Details","Products" , new id=item.ProductId ,null)
【讨论】:
【参考方案9】:这段代码在部分视图中对我有用:
<a href="/Content/Index?SubCategoryId=@item.Id">@item.Title</a>
【讨论】:
虽然这确实有效,但它绕过了使用 ActionLink 的全部要点...... ActionLink 的全部要点是避免手动输入 URL 和可能产生的潜在问题以上是关于使用 Html.ActionLink 在不同的控制器上调用动作的主要内容,如果未能解决你的问题,请参考以下文章
带有字形图标和不同字体文本的 ASP.NET Actionlink
html.actionlink 没有将参数传递给控制器动作