【问题标题】:MVC Html.ActionLink not passing querystring properlyMVC Html.ActionLink 未正确传递查询字符串
【发布时间】:2010-04-09 21:14:26
【问题描述】:

这看起来应该很简单,但我显然很困惑。

我有一个显示分页列表的列表视图。在底部我有一组操作链接:

<%= Html.ActionLink("First Page", "List", new { page = 1} ) %>
&nbsp; 
<%= Html.ActionLink("Prev Page", "List", new { page = Model.PageNumber - 1 }) %>
&nbsp;
<%= Html.ActionLink("Next Page", "List", new { page = Model.PageNumber + 1 }) %>
&nbsp;
<%= Html.ActionLink("Last Page", "List", new { page = Model.LastPage } )%>

我使用的是基本的默认路由设置,除了用“列表”代替“索引”:

            routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "List", id = UrlParameter.Optional } // Parameter defaults
        );

问题在于 ActionLink 助手正在生成以下形式的链接:

http://localhost:2083/Retrofit?page=2

而不是

http://localhost:2083/Retrofit/?page=2

(在控制器名称之后和查询字符串之前带有斜杠)。当第一个 URL 被路由时,它完全丢失了查询字符串——如果我在它到达控制器时查看 Request.QueryString,它是空的。如果我输入第二个 URL(带有斜杠),它会正确输入(即“page=2”的 QueryString)。

那么我怎样才能让 ActionLink 帮助程序生成正确的 URL,或者让路由正确解析 ActionLink 正在生成的内容?

谢谢。

【问题讨论】:

    标签: model-view-controller routing query-string


    【解决方案1】:

    您需要选择以下两种操作之一:

    1. 修改您的路由以采用page 参数而不是默认的id,并相应地修改您的操作方法的签名。

    2. 修改对Html.AcitonLink()的调用,以便将参数命名为id——即将new { page = ... }更改为new { id = ... }

    【讨论】:

    • 托马斯,确实做到了。它现在生成一个“localhost:2083/Retrofit/List/1”的链接。但是,这不是我想要的。我想要的是将页码生成为查询字符串:“localhost:2803/Retrofit/?page=<n>”。我需要同时拥有一个可选的id(用于查看/编辑项目的详细信息)在 URL 的路径中给出,以及作为查询字符串给出的可选页码。我该怎么做?
    【解决方案2】:

    这是一个老问题,但对于其他人,我想我会添加您正在寻找的答案是将两者都添加到 routeValues 参数中,例如

     Html.ActionLink("Last Page", "List", new { id = Model.ID, page = Model.LastPage } )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-19
      • 1970-01-01
      • 1970-01-01
      • 2014-03-27
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 2017-11-14
      相关资源
      最近更新 更多