2010-11-24 16 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); 
    } 

私は、次のURLで、このコントローラのアクションにアクセスできるようにしたいと思います:

  • もの
  • もの/ PAGE2
  • 物件/1111-14-2010/to11-24-2010
  • 物件/ from11-14-2010/to11-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つのルートに単純化できますか?

答えて

1

私は/ page2とthings/from11-14-2010/...を同じルートにマッチさせることはできません。ルートの終わりにオプションの値しか持たないからです。あなたがちょうど2つのルートにそれを減らすことができますしかし:

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*)?" } 
); 

あなたはパラメータと一致する正規表現制約を使用して接頭辞にしてから、ページを排除することができます。

routeでpage(1)のデフォルト値を設定することでコントローラを簡素化することもできます。そのため、null可能である必要はありません。それ以外の場合は、最初のルートのページ値にUrlParameter.Optionalを使用する必要があります。

+0

接頭辞との間でページを削除していないのですが、URLを追加して友好的にすると感じています。 – xTRUMANx

+0

これで十分です。そのように動作するように2つのルートを変更することができます。 – Steve

+0

ヘイスティーブ、ついにあなたの提案を試してみました。プレフィックスとの間でページを使用しないと、ルートがうまくいくようです。 4つのルートはそれほど悪くはないと思います。 – xTRUMANx