2011-01-18 19 views
1

私はこのルーティングを自分のグローバルasaxに追加しました。asp.net mvc routing issues

routes.MapRoute(
    "News", // Route name 
    "News/{timePeriod}/{categoryName}/{page}", // URL with parameters 
    new { controller = "News", action = "Index", 
     timePeriod = TimePeriod.AllTime, categoryName = "All", page = 1 }, 
    new { page = @"^\d{1,3}$" }// Parameter defaults 
); 

routes.MapRoute(
    "News2", // Route name 
    "News/{categoryName}/{page}", // URL with parameters 
    new { controller = "News", action = "Index", 
     timePeriod = TimePeriod.AllTime, categoryName = "All", page = 1 }, 
    new { page = @"^\d{1,3}$" }// Parameter defaults 
); 

問題は/ニュースのようなURLである(私は特定のルートを追加しない限り)/文句を言わない作業を追加 グローバルasaxでURLアクションを指定することなく、より良い方法はありますか?

+2

ところで、あなたがParamter Defaultsとしてマークした行は、Parameter Constraintsです。パラメータのデフォルトは1行上です。 – mlusiak

答えて

0

私はそれがそれを捕まえると思います。しかし、あなたがidのような余分な引数を渡さない場合にのみ(News2のルートと非常に似ています)。

routes.MapRoute(
"News0", 
"News/{action}", 
new { controller = "News", action = "Index" } 
); 

はまた、あなたが望む効果をテストするためのルーティングデバッガを試してみてください。 link

0

あなたの二つの経路上の各ニュースコントローラへのルートとは、「インデックス」アクションをヒットします。指定したパラメータを使用するインデックスアクションのオーバーロードがない場合、ルートは正しく動作しません。あなたは、ルート自体にそれを使用していないため、また、あなたはあなたの第2の経路からの時間期間のデフォルトパラメータを削除する必要があります

public ActionResult Index(TimePeriod timePeriod, string categoryName, int page) {..} 

public ActionResult Index(string categoryName, int page) {..} 

routes.MapRoute(
       "News2", // Route name 
       "News/{categoryName}/{page}", // URL with parameters 
       new { controller = "News", action = "Index", categoryName = "All", page = 1 }, 
       new { page = @"^\d{1,3}$" }// Parameter defaults 
      ); 

をたとえば、あなたは、これら二つのアクションを持っている必要があります各カテゴリのルートを作成するのではなく、すべてのカテゴリのアクションを実行することをお勧めします。あなたはこれにあなたのルートを簡素化することができます:

routes.MapRoute(
       "News", // Route name 
       "News/{action}/{timePeriod}/{page}", // URL with parameters 
       new { controller = "News", action = "Index", timePeriod = TimePeriod.AllTime, categoryName = "All", page = 1 }, 
       new { page = @"^\d{1,3}$" }// Parameter defaults 
      ); 

が次に各カテゴリの作用を有する:

public ActionResult All(TimePeriod timePeriod, string categoryName, int page) {..} 

public ActionResult Sports(TimePeriod timePeriod, string categoryName, int page) {..} 

public ActionResult Weather(TimePeriod timePeriod, string categoryName, int page) {..} 

この方法では、あなたが必要とするすべては1つのルートです。

+0

これは良い解決策ですが、reklasはURLをより良くするために、別のルートを使用したいと考えているかもしれません。たとえば、彼はニュースアクションを追加するためのページを必要としませんが、結果を表示するときにはそれを必要とします。 – mlusiak

+0

@kMike - そうであれば、ルートではパラメタをオプションにする必要があり、URLにはそれらを含める必要はありません。 – amurra