为什么我的路由不起作用?

时间:2011-12-04 10:23:23

标签: asp.net-mvc

我试图在我的应用程序上设置替代路线...

 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总是为空......: - (

2 个答案:

答案 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的不必要调用