【问题标题】:Using Html.ActionLink to call action on different controller使用 Html.ActionLink 在不同的控制器上调用动作
【发布时间】: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 = "" } );

【问题讨论】:

    标签: asp.net-mvc


    【解决方案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 和可能产生的潜在问题
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-08-22
            • 1970-01-01
            • 1970-01-01
            • 2012-03-13
            • 2010-11-22
            • 1970-01-01
            相关资源
            最近更新 更多