在MVC3中生成RouteUrl在一种情况下返回null

时间:2011-08-18 13:24:27

标签: c# asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing

我的路线定义如下:

 routes.MapRoute("Date", "Date/{year}/{month}/{day}", 
    new { controller = "Date", action = "Index", year = UrlParameter.Optional,
         month = UrlParameter.Optional, day = UrlParameter.Optional });

因此它有3个可选参数,年,月和日。它在路由GET请求时工作正常,以下所有工作正常:

http://myhost/myapp/Date
http://myhost/myapp/Date/2011
http://myhost/myapp/Date/2011/8
http://myhost/myapp/Date/2011/8/17

使用RouteUrl生成链接适用于除一个以外的所有情况。

例如,我想要包含年份和月份的链接的情况正常。我在视图中使用以下(简化)代码:

 string linkUrl = Url.RouteUrl("Date",
     new { controller = "Date", year = 2011, month = 8 },
     Request.Url.Scheme);

但只定义年份的情况不起作用并返回null,代码为:

string linkUrl = Url.RouteUrl("Date",
    new { controller = "Date", year = 2011 },
    Request.Url.Scheme);

所以这一切对我来说都是正确的。任何线索我做错了什么,或者如何进一步调试。

1 个答案:

答案 0 :(得分:2)

好吧,看起来这是MVC3中引入的已知“问题”,但由于.NET4中的路由存在潜在问题,因此无法通过MVC团队快速修复。虽然默默地返回null显然是一个错误,但是我不清楚我最初创建的路径是否也应该以我想要的方式工作(见下文)。

我发现此SO Question要求人们使用两个可选参数复制类似问题,答案也会引用this article,这有一个解决方法。

我根据解决方法通过制作多个路由解决了这个问题,每个路由只有一个可选参数。

  routes.MapRoute(
    "Date-ByDay", // Route name
    "Date/{year}/{month}/{day}", // URL with parameters
    new { controller = "Date", action = "Index" } // Parameter defaults
  );

  routes.MapRoute(
    "Date-ByMonth", // Route name
    "Date/{year}/{month}", // URL with parameters
    new { controller = "Date", action = "Index", month = UrlParameter.Optional } // Parameter defaults
  );

  routes.MapRoute(
    "Date-ByYear", // Route name
    "Date/{year}", // URL with parameters
    new { controller = "Date", action = "Index", year = UrlParameter.Optional } // Parameter defaults
  );

我的原始方法是否应该起作用是有争议的,例如,如果您错过了可选的'month'参数,原始路由是否应生成/ 2011/18的URL?虽然丑陋的“解决方法”肯定对你想要的行为更加明确。我认为我的原始路线的预期行为是明确的(对我来说),如果我要求一年一天的路线,那么我本来期望一个例外,错过了一个月 - 但我可以看到,这可能不是每个人的观点。但是 在MVC2中工作。