我的路线定义如下:
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);
所以这一切对我来说都是正确的。任何线索我做错了什么,或者如何进一步调试。
答案 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中工作。