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

kai*_*lya 220 asp.net-mvc

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

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

<%= Html.ActionLink("Details", "Details", "Product", new { id=item.ID }) %>
Run Code Online (Sandbox Code Playgroud)

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

Hat/Details/9?Length=7
Run Code Online (Sandbox Code Playgroud)

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

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

routes.MapRoute("Default", "{controller}/{action}/{id}", 
                     new { controller = "Home", action = "Index", id = "" } );
Run Code Online (Sandbox Code Playgroud)

Çağ*_*kin 397

你想要的是这个重载:

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

  • 这是因为如果你使用其他参数,它假定第三个参数是routevalues,第四个参数是htmlattributes.添加第5个参数会强制该方法使用正确的重载.翻阅intellisense中的重载,这将更有意义. (34认同)
  • 我同意,过载参数设计不佳..我认为这是一个最长时间的错误.我真的不得不在智能感知中第9次凝视,以了解我使用了错误的签名 (3认同)
  • ActionLink的重载非常笨拙.接受"对象routeValues"而不是RouteValueCollection的全部意义是减少键入的数量.但是,您最终必须输入一个额外的null.非直观和反效果...... (2认同)
  • 对于未来的读者,如果您遇到此问题并尝试添加 css 样式,这是正确的重载。@Html.ActionLink("MyText", "MyAction", "MyController", null, new { @class = "myClass" }) (2认同)

Ste*_*ter 17

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

什么对我有用:

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

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

我正在使用MVC 4.

Cheerio!

  • 你的代码行不会触发你提到的重载,而是HtmlHelper.ActionLink(字符串linkText,字符串actionName,object routeValues,object htmlAttributes).这产生了OP试图避免的相同结果.您需要添加一个额外的null参数. (2认同)

Jam*_*ery 10

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

<%=Html.ActionLink<Product>(c => c.Action( o.Value ), "Details" ) %>
Run Code Online (Sandbox Code Playgroud)

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


Psi*_*-Ed 10

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

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


Cra*_*ntz 7

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

<%= Html.ActionLink("Details", "Details", "Product", new RouteValueDictionary(new { id=item.ID })) %>
Run Code Online (Sandbox Code Playgroud)


san*_*ker 6

试试它工作正常

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