2010-11-24 62 views
1

我正在使用ASP.NET MVC3 RC1开展一个项目,并想知道我的路线是否可以简化。路由简化

我有了这个控制器动作:

public ActionResult Things(DateTime? fromDate, DateTime? toDate, int? pageNo) 
    { 
     DataLayer dataLayer = new DataLayer(); 

     int page = pageNo.HasValue ? pageNo.Value : 1; 

     List<Thing> things = dataLayer.GetThingsByDateRangePaged(User.Identity.Name, fromDate, toDate, pageNo, PageSize); 

     return View(things); 
    } 

我希望能够通过访问以下网址此控制器操作:

  • 事情
  • 事情/第2页
  • 东西/从11-14-2010 /到11-24-2010
  • 东西/从11-14-2010 /到11-24-2010/page2

我目前有这些路线编制:

routes.MapRoute("Things", 
    "Things", 
    new { controller = "Thing", action = "Things" } 
    ); 

routes.MapRoute("ThingsPaged", 
    "Things/Page{pageNo}", 
    new { controller = "Thing", action = "Things" } 
    ); 

routes.MapRoute("ThingsCertainPeriod", 
    "Things/From{fromDate}/To{toDate}", 
    new { controller = "Thing", action = "Things" } 
    ); 

routes.MapRoute("ThingsCertainPeriodPaged", 
    "Things/From{fromDate}/To{toDate}/Page{pageNo}", 
    new { controller = "Thing", action = "Things" } 
    ); 

在我看来,我的路线是成熟的重构,但我不完全知道如何摆脱冗余。 UrlParameter.Optional似乎并不像我在尝试使用它时那样工作。我的路线可以简化为一条路线吗?

回答

1

我不认为你可以匹配东西/ page2和东西/从11-14-2010/...具有相同的路线,因为它只有在路线的末尾有一个可选的值是有意义的。然而,你可以把它删减到只有两个途径:

routes.MapRoute(
    "Thing1", 
    "Thing/Thing/{from}/{to}/{page}", 
    new { controller = "Thing", action = "Thing", page = 1 }, 
    new { from = @"(\d{1,2}-\d{1,2}-\d{4})?", to = @"(\d{1,2}-\d{1,2}-\d{4})?" } 
); 

routes.MapRoute(
    "Thing2", 
    "Thing/Thing/{page}", 
    new { controller = "Thing", action = "Thing", page = 1 }, 
    new { page = @"(\d*)?" } 
); 

您可以删除该网页,并从前缀通过使用正则表达式约束相匹配的参数。

您还可以通过设置路由中页面(1)的默认值来简化控制器,使其不必为空。否则,您将不得不使用UrlParameter.Optional作为第一个路由中的页面值。

+0

我宁愿我没有消除页面,来自前缀,因为我觉得他们添加到网址,使它更友好。 – xTRUMANx 2010-11-24 16:25:25