我试图在我的应用程序上设置替代路线...
routes.MapRoute(
"x", // Route name
"{controller}/{action}/{datetime}", // URL with parameters
new { controller = "Home", action = "Index", datetime = UrlParameter.Optional } // Parameter defaults
);
我有行动......
public ActionResult GetBlogsByMonth(string datetime)
{
if (datetime!= null)
{
IList<BlogModel> blogs = (IList<BlogModel>)manager.GetBlogsInMonth(DateTime.Parse(datetime)).ToList();
return View(blogs);
}
else
{
return View();
}
}
但是当我把调试器放在动作上时,datetime总是为空......: - (
答案 0 :(得分:1)
可能您的请求已被另一条路线捕获。注册时务必将路线置于顶部。
例如,如果您使用此路线时使用默认路线,则默认路线将捕捉请求,而不是您按照以下顺序引用它们的自定义路线:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
routes.MapRoute(
"x", // Route name
"{controller}/{action}/{datetime}", // URL with parameters
new { controller = "Home", action = "Index", datetime = UrlParameter.Optional } // Parameter defaults
);
至于解决方案,正如@Darin建议的那样,你需要定义一个约束,因为如果你把自定义的一个放在前面,这次默认的那个就永远不会被命中。
routes.MapRoute(
"x", // Route name
"{controller}/{action}/{datetime}", // URL with parameters
new { controller = "Home", action = "Index", datetime = UrlParameter.Optional }, // Parameter defaults
new { datetime = @"^(19|20)\d\d([- /.])(0[1-9]|1[012])\2(0[1-9]|[12][0-9]|3[01])$" }
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
以下网址将由您的自定义路线捕获:
/浦/酒吧/ 2011年11月31日
/浦/酒吧/ 2011-01-04
/浦/酒吧/ 2011-01-04
您可以根据需要更改RegEx。
答案 1 :(得分:0)
构建指向操作的链接时,可以使用RouteLink而不是ActionLink。使用RouteLink,您可以传递命名路由名称以强制选择正确的路由来构建链接。对于您的示例,链接应该看起来像这样:
@Html.RouteLink("Blog Posts...", "x", new { controller="Blog", action="GetBlogsByMonth" datetime = THEDATETIME })
提示:您可以在操作中使用DateTime类型作为参数而不是String类型,这样就可以避免对DateTime.Parse的不必要调用