我有一个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
);

这是我的问题。我有一个 View ,我想在其中创建以下形式的链接: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
}

当我在 View 中添加@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?为何它不适用于那种情况,却能按年/月和年/月/日的情况工作呢?

    谢谢

    最佳答案

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

    关于asp.net-mvc - 为什么将此路由参数附加到查询字符串上?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7085762/

    10-13 03:15