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

C# 在MVC3中生成RouteUrl在一种情况下返回null,c#,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-routing,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请求时可以正常工

我的路线定义如下:

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

所以在我看来这一切都是正确的。任何关于我做错了什么或如何进一步调试的线索。

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

我发现这要求人们用两个可选参数复制一个类似的问题,答案也提到了这一点,它有一个解决方法

我通过创建多个路由解决了这个问题,每个路由中只有一个可选参数

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

我的原始方法是否仍然有效还存在争议,例如,如果您遗漏了可选的“月”参数,以及原始路线是否应生成/2011/18的URL?“变通办法”虽然难看,但对于你想要的行为肯定要明确得多。我会争辩说,我的原始路线的预期行为对我来说是清楚的,如果我要求一条路线有一年零一天,而错过了一个月,我会预期一个例外——但我可以看出,这可能不是每个人的观点。然而,这在MVC2中确实起作用。

作为一种可能的解决方法,只取一个日期参数,然后计算出它在控制器代码中的类型是什么?日期作为字符串?URL为/Date/08-18-2011?也许吧,但当浏览器只要求显示年份或月份时,我需要显示不同的视图。谢谢。是的,像那样或者没有空格或斜线。然后有一些代码来检查长度,找出它是什么,然后根据它构建日期时间?如果我一直在寻找“完整日期”,那就行了。我在寻找如果客户打电话给/Date给出数据库中所有年份的数据列表,那么/Date/2011将返回2011年所有月份的数据。我想如果缺少一个零件,我可以通过00或0000。但这几乎开始变得更加复杂,感觉不那么平静。