使用Html.ActionLink在不同的控制器上调用动作


224

我正在尝试使用进行控制器之间的导航ActionLink。我将用一个例子来说明我的问题。

我在Hat控制器的索引视图上,并且尝试使用以下代码创建指向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 = "" } );

Answers:


409

您想要的是此重载:

//linkText, actionName, controllerName, routeValues, htmlAttributes
<%=Html.ActionLink("Details", "Details", 
    "Product", new {id = item.ID}, null) %>

1
您能解释为什么这种特殊的超载有效而korki的无效吗?将htmlAttributes设置为null如何影响链接的路由?
Derek Hunziker

35
这是因为,如果您使用其他参数,则会假定第三个参数是routevalues,第四个参数是htmlattributes。添加第5个参数会强制该方法使用正确的重载。浏览智能感知中的重载,这将更有意义。
班福德

2
ActionLink的重载确实很笨拙。接受“对象routeValues”而不是RouteValueCollection的全部目的是减少键入量。但是,您最终不得不输入一个额外的null。非直觉和适得其反...
TiMoch

3
我同意,重载参数设计不当。.我认为最长的时间是一个错误。我真的不得不盯着所有的
智商

1
对于将来的读者,如果遇到此问题并尝试添加CSS样式,则这是正确的重载。@ Html.ActionLink(“ MyText”,“ MyAction”,“ MyController”,空,新的{@class =“ myClass”})
granadaCoder

17

使用该参数,您将触发错误的重载函数/方法。

对我有用的是:

<%= Html.ActionLink("Details", "Details", "Product", new { id=item.ID }, null) %>

它触发HtmlHelper.ActionLink(字符串linkText,字符串actionName,字符串controllerName,对象routeValues,对象htmlAttributes)

我正在使用MVC 4。

加油!


2
您的代码行不会触发您提到的重载,而是触发HtmlHelper.ActionLink(字符串linkText,字符串actionName,对象routeValues,对象htmlAttributes)。这产生了OP试图避免的相同结果。您需要添加其他null参数。
TiMoch 2013年

感谢TiMoch,错过了那个吗?
Stephan Venter

12

为了清楚起见,我建议使用命名参数编写这些帮助程序,如下所示:

@Html.ActionLink(
    linkText: "Details",
    actionName: "Details",
    controllerName: "Product",
    routeValues: new {
        id = item.ID
    },
    htmlAttributes: null
)

从2019年起,JetBrains在ReSharper中实现了此功能。在这种情况下,实际上非常有帮助。
杰米

10

如果抓住了MVC Futures程序集(我强烈推荐),则可以在创建ActionLink和lambda时使用泛型来构造路线:

<%=Html.ActionLink<Product>(c => c.Action( o.Value ), "Details" ) %>

您可以在此处获取期货大会:http : //aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471


感谢您的实际链接-试图找到它!
Perhentian

1
不过请务必小心,因为它未包含在MVC2中。理由是动作不一定是方法(我同意,但是迁移已经很痛苦了,因为我们已经使用通用方法已有一段时间了)。这是有关为什么不保留它的完整文章2:haacked.com/archive/2008/08/29/…–
Stu


6

试试吧,它工作正常

  <%:Html.ActionLink("Details","Details","Product",  new {id=item.dateID },null)%>

3

一种替代解决方案是使用Urlhelper对象来设置标签的href属性,<a>例如:

<a href="@Url.Action("Details", "Product",new { id=item.ID }) )">Details</a>

1

请注意,“详细信息”是“产品”文件夹下的“查看”页面。

ProductId是表的主键。这是Index.cshtml中的行

 @Html.ActionLink("Details", "Details","Products" , new  {  id=item.ProductId  },null)

0

这段代码在部分视图下对我有用:

<a href="/Content/Index?SubCategoryId=@item.Id">@item.Title</a>

尽管这样做确实可行,但它绕开了使用ActionLink的整个过程……整个ActionLink的工作都是避免手动键入URL和可能造成的潜在问题
Jon Story
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.