为什么这个路由参数被添加到查询字符串中?

Sco*_*ell 6 asp.net-mvc asp.net-routing

我有一个ASP.NET MVC 3应用程序,它记录用户的计步器条目.用户可以通过访问查看所有最新计步器条目/Pedometer,并通过访问像URL可以按年,年/月,或年/月/日筛选/Pedometer/2011,/Pedometer/2011/08/Pedometer/2011/08/15分别.

我在中创建了两个映射路由Global.asax.第一条路由(如下所示)允许各种URL模式按日期过滤.第二个路由(未显示)是默认的ASP.NET MVC路由.

routes.MapRoute(
    "PedometerEntries", // Route name
    "Pedometer/{year}/{month}/{day}", // URL with parameters
    new
    {
        controller = "Pedometer",
        action = "Index",
        year = UrlParameter.Optional,
        month = UrlParameter.Optional,
        day = UrlParameter.Optional
    }, // Parameter defaults
    new
    {
        year = @"\d{4}",
        month = @"([012]?\d{1})?",
        day = @"(([1-9])|([12][0-9])|(3[0-1]))?"
    } // Parameter constraints
);
Run Code Online (Sandbox Code Playgroud)

这是我的问题.我有一个视图,我想创建一个表单的链接:currentUrl?format=csv,这将允许用户以CSV格式下载所请求的URL的计步器条目.因此,如果用户正在访问/Pedometer,则下载链接将是/Pedometer?format=csv.如果用户正在访问,/Pedometer/2011/08则下载链接将是/Pedometer/2011/08?format=csv.

为了创建这样的链接,我添加了一个DownloadToExcel使用以下代码命名的自定义Html Helper :

public static MvcHtmlString DownloadToExcel(this HtmlHelper helper, string linkText)
{
    RouteValueDictionary routeValues = helper.ViewContext.RouteData.Values;

    // Add the format parameter to the route data collection, if needed
    if (!routeValues.ContainsKey("format"))
        routeValues.Add("format", "csv");

    return helper.ActionLink(linkText,                          // Link text
                                routeValues["action"].ToString(),  // Action
                                routeValues);                      // Route values
}
Run Code Online (Sandbox Code Playgroud)

当我@Html.DownloadToExcel()在我的视图中添加标记时,它会生成一个链接,但这就是擦除 - 当用户访问最近的条目或按年/月或年/月/日过滤的条目时,它按预期工作,但不是用户访问年度过滤器URL.

以下列表显示了用户访问的URL以及自定义Html Helper生成的相应URL:

  • 访问:/Pedometer- 下载链接:/Pedometer?format=csv
  • 访问:/Pedometer/2011- 下载链接:/Pedometer?year=2011&format=csv
  • 访问:/Pedometer/2011/08- 下载链接:/Pedometer/2011/08?format=csv
  • 访问:/Pedometer/2011/08/15- 下载链接:/Pedometer/2011/08/15?format=csv

访问/Pedometer/2011下载链接的原因是/Pedometer?year=2011&format=csv什么/Pedometer/2011?format=csv?为什么它不适用于那个案例,但按年/月和年/月/日期的情况按预期工作?

谢谢

Geo*_*ker 6

这个问题很可能是由Phil Haack在他博客上描述的这个错误造成的.当您有两个连续的可选URL参数时,ASP.NET MVC 3中引入了回归错误.