使用 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 辅助对象来设置&lt;a&gt; 标记的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 在不同的控制器上调用动作的主要内容,如果未能解决你的问题,请参考以下文章

@html.ActionLink的几种参数格式

带有字形图标和不同字体文本的 ASP.NET Actionlink

转@html.ActionLink的几种参数格式

html.actionlink 没有将参数传递给控制器​​动作

MVC Html.ActionLink Area 链接中含区域的页面之间的跳转

如何改进在样式 div 内使用 Html.ActionLink 的按钮