2010-11-24 58 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