2011-09-14 15 views
0

アドレスバーでURLを読みやすくするために、私は現在ルーティングに取り組んでいます。ルーティングの最適化

例えば、基本的なURLがある場合:?... /アフェール/ SearchAffaires OnlyFavorite = Trueの

私は、以下のルートを追加しました:

routes.MapRoute(
    "Search Affaire Only Favorite", // Route name 
    "Affaire/SearchAffaires/OnlyFavorite", // URL with parameters 
    new { controller = "Affaire", 
     action = "SearchAffaires", 
     OnlyFavorite = true } // Parameter defaults 
); 

URLは次のように表示されています:.../Affaire/SearchAffaires/OnlyFavorite

これまでのところ、とても良いです。

別の例として、基本的なURLがある場合:?以下のステータステーブルで... /アフェール/ SearchAffaires IdStatus = 1

1 =オープン/ 2 =クローズ/ 3 =キャンセルしました

このようなURLを取得するにはどうすればいいですか:.../Affaire/SearchAffaires/Open

答えて

1

カスタムルートを書くことができます:

あなたは、このように登録します
public class SearchRoute : Route 
{ 
    public SearchRoute() 
     : base(
      "Affaire/SearchAffaires/{searchToken}", 
      new RouteValueDictionary(new { controller = "Affaire", action = "SearchAffaires" }), 
      new MvcRouteHandler() 
     ) 
    { } 

    public override RouteData GetRouteData(HttpContextBase httpContext) 
    { 
     var rd = base.GetRouteData(httpContext); 
     if (rd == null) 
     { 
      return null; 
     } 
     var searchToken = rd.Values["searchToken"] as string; 
     if (string.IsNullOrEmpty(searchToken)) 
     { 
      return rd; 
     } 

     if (string.Equals("OnlyFavorite", searchToken, StringComparison.OrdinalIgnoreCase)) 
     { 
      rd.Values["onlyFavorite"] = true; 
     } 

     var statuses = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase) 
     { 
      { "open", "1" }, 
      { "close", "2" }, 
      { "cancelled", "3" }, 
     }; 

     string idStatus; 
     if (statuses.TryGetValue(searchToken, out idStatus)) 
     { 
      rd.Values["idStatus"] = idStatus; 
     } 

     return rd; 
    } 
} 

routes.Add("Search Affaires", new SearchRoute()); 

ここでは、これが動作する方法は次のとおりです。SearchAffaires

  • Affaire/SearchAffaires/OnlyFavorite意志ルートコントローラーAffaireの動作となります。onlyFavorite=true引数。
  • Affaire/SearchAffaires/openは、Affaireコントローラーのアクションにルーティングし、idStatus=1引数を渡します。 closeおよびcancelledと同じです。
  • 他のURLパターンはこのルートで無視されます