2011-08-16 47 views
6

我有一个记录用户的计步器条目的ASP.NET MVC 3应用程序。用户可以通过访问/Pedometer查看所有最近的计步器条目,并可以分别访问/Pedometer/2011,/Pedometer/2011/08/Pedometer/2011/08/15等URL,按年,年/月或年/月/日进行过滤。为什么这个路由参数被添加到查询字符串中?

我在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 
); 

这是我的问题。我有一个观点,我想创建一个表格链接:currentUrl?format=csv,它可以让用户以CSV格式下载所请求URL的计步器条目。因此,如果用户访问/Pedometer,则下载链接将为/Pedometer?format=csv。如果用户访问/Pedometer/2011/08,则下载链接将为/Pedometer/2011/08?format=csv

要建立这种联系我加了一个自定义的HTML辅助命名DownloadToExcel用下面的代码:

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 
} 

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

下面的列表显示的URL的用户访问,并通过自定义HTML辅助生成相应的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?为什么它不适用于这种情况,但按照年/月/年/月/日的情况按预期工作?

感谢

回答

6

这个问题最有可能由菲尔哈克在他的博客中描述this bug引起的。当您有两个连续的可选URL参数时,ASP.NET MVC 3中引入了一个回归错误。

+0

解释它,谢谢你的抬头。 :-) –

4

我创建了您提供的一小段代码MVC 3应用程序并按照上述方法得到了完全一样的行为。

如果我去http://localhost:51181/pedometer/2011生成的链接将是http://localhost:51181/Pedometer?year=2011&format=csv

但是,如果我明确输入动作(索引)的名称,它会正确渲染。

访问http://localhost:51181/pedometer/index/2011将产生以下链接:

http://localhost:51181/pedometer/index/2011?format=csv

看来正确的路线并不总是由的HtmlHelper扩展方法使用。

如果我在自定义路线的下方添加以下路线,但在默认MVC路线之前,它工作正常。

routes.MapRoute(
    "PedometerDefault", 
    "Pedometer/{year}", 
    new { controller = "Pedometer", action = "Index", 
      year = UrlParameter.Optional } 
); 
+0

这看起来像Phil Haack在@George Stocker的答案中的博客文章中推荐的解决方法。 –

+0

是的,似乎是这样。在那之前不知道这个bug。 –

相关问题