关于asp.net mvc:使用Html.ActionLink在不同的控制器上调用动作

Using Html.ActionLink to call action on different controller

我试图使用ActionLink在控制器之间导航。 我将以一个例子告诉我的问题。

我在Hat控制器的索引视图上,我正在尝试使用下面的代码创建一个指向Product控件的Details操作的链接。

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

这不会创建指向Product控件上的Details的链接,而是在Hat控制器下生成一个指向Details操作的链接,并将Length参数附加到它的末尾:

1
Hat/Details/9?Length=7

由于此问题,我无法使用HTML.ActionLink在控制器之间切换。 如果你能指出我做错了什么,我将不胜感激。 谢谢

PS:我使用的是MVC附带的默认路由设置

1
2
routes.MapRoute("Default","{controller}/{action}/{id}",
                     new { controller ="Home", action ="Index", id ="" } );

你想要的是这个重载:

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


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

什么对我有用:

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

它触发HtmlHelper.ActionLink(string linkText,string actionName,string controllerName,object routeValues,object htmlAttributes)

我正在使用MVC 4。

Cheerio!


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

1
2
3
4
5
6
7
8
9
@Html.ActionLink(
    linkText:"Details",
    actionName:"Details",
    controllerName:"Product",
    routeValues: new {
        id = item.ID
    },
    htmlAttributes: null
)


如果您获取MVC Futures程序集(我强烈推荐),您可以在创建ActionLink时使用泛型,并使用lambda来构造路径:

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

你可以在这里获得期货装配:http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId = 24471


你错了ActionLink的重载。试试这个。

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

试试它工作正常

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


另一种解决方案是使用Url辅助对象来设置标记的href属性,如:

1
Details

这段代码在局部视图中对我有用:

1
@item.Title