2011-01-31 19 views
0

ASP.Net MVCを初めて使用しています。この質問は簡単に見えるかもしれませんが、私はそれを修正することができませんでした。ここにシナリオ。私は都市に基づいてデータをリストアップしているアプリケーションを持っています。だから、URLは最初の部分(チェンナイ/ムンバイ)のルーティング、通常はこの動的ASP.Netルーティングの問題

 www.xxxxxx.in/chennai 
     www.xxxxxx.in/mumbai 
     www.xxxxxx.in/delhi 

のように見えることになる上記URL内のコントローラである、しかし、ここで私は、これは、コントローラになりたいいけません。代わりに、私は単一のコントローラ(LocationController)をこれらのUR1にマップしたいと思っています。後で私は都市の任意の数を追加することができますので。

私はここで打たれた、誰かが私を助けることができます。

答えて

2

はこれを試してみてください:

routes.MapRoute(
      "CityRoute",            // Route name 
      "{city}",       // URL with parameters 
      new { controller = "Location", action = "Index", city = "" } // Parameter defaults 
     ); 
+0

あなたが言ったように私は試みました。しかし、それは動作していません... – RameshVel

+0

@Ramesh:それは動作していないという意味ですか?あなたはまだ元のルート定義を使用していますか?'city'という文字列パラメータを持つコントローラアクションを持っていますか?これは間違いなく機能します。あなたは間違ったことをしているに違いない。 –

+0

@Robert Koritnik、はい私はこれと一緒に元の定義を使用していた...私はあなたの答えを探しています。問題があれば私は変わります... – RameshVel

0

あなたは、コントローラ名をハードコードルートを追加することによってそれを行うことができます。

routes.MapRoute(
    "location", // Route name 
    "{cityName}", // URL with parameters 
    new { controller = "location", action = "index" } // Parameter defaults 
); 

routes.MapRoute(
    "Location", // Route name 
    "{controller}/{action}/{cityName}", // URL with parameters 
    new { controller = "Location", action = "index"} // Parameter defaults 
) 

この意志のルートは、フォームのすべての要求を「/ムンバイ」にLocationControllerアクションメソッドIndexパラメータ「cityName」が「mumbai」に設定されている。また、第2のルートを使用してフルコントローラ/アクション仕様をルーティングすることもできます。

+0

その動作していません... – RameshVel

+0

これは正しいルートではありません: 'www.xxxxxx.in/location/index/mumbai'として動作し、それは彼が望むものではありません。 –

+0

@Robert Koritnik定義されている唯一のルートであれば動作します。フレームワークは、それらが提供されていないときにデフォルト値を置き換え、明示的なコントローラー/アクション/パラメーターURLを許可します。 –

1

これよりも簡単なオプションはないとは思いますが、これを試すことができます - 経路制約を使用してください。基本的には、あなたが持っている都市のリストを知ってから、そのリスト内のエントリーとのみ一致するようにルートを制約する必要があります。

ルート制約が

public class CityConstraint : IRouteConstraint 
{ 
    public static IList<string> CityNames = (Container.ResolveShared<ICityService>()).GetCities(); 

    bool _IsCity; 
    public CityConstraint(bool IsCity) 
    { 
     _IsCity = IsCity;    
    } 

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     if (_IsCity) 
      return CityNames.Contains(values[parameterName].ToString().ToLower()); 
     else 
      return !CityNames.Contains(values[parameterName].ToString().ToLower()); 
    } 
} 

を次のように実装され、その後、次のようにルートを置くことができます。

routes.MapRoute("Location", "{cityName}", new { controller = "LocationController", action = "Index" }, new { cityName = new CityConstraint(true) }); 

も必ず上記のルートがデフォルトルート

routes.MapRoute("Default", // Route name 
       "{controller}/{action}/{id}", // URL with parameters 
       new { controller = "Home", action = "Index", id = UrlParameter.Optional 
      ); 
前にリストされていることを確認

コントローラ名には都市名を使用できません。

これを試してみてください。あなたはまだあなたが必要な場合は

public class LocationController : Controller 
{ 
    public ActionResult Index(string city) 
    { 
     // do whatever needed; "city" param has the city specified in URL route 
    } 
} 

+0

sいいアイデアをありがとう:その面白い:) – RameshVel

+0

有限数のコントローラが定義されているので、ルートの順序を逆にしてコントローラ名制約を置く方が良いでしょう。データベース。したがって、最初に制約を設定してからデフォルトのルートを作成してから、 –

+0

リバースすると、カスタム制約クラスは必要ありません。組み込みの制約機能を簡単に使用できます。 –

1

すべてのルーティングはデフォルトルートを削除して、このルート定義とそれを置き換えるよりも、これらの都市に関連している場合:

routes.MapRoute(
    "Default", 
    "{city}", 
    new { controller = "Location", action = "Index", city = "Mumbai" } 
); 

はその後LocationControllerクラスを作成します都市だけでなく他のページのデフォルトルート(コントローラ/アクション/ ID)を設定すると、デフォルトルートに制約を入れて、次のように定義する方がよいでしょう:

routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
    new { controller = "Home|...|..." } // put all controllers here except "Location" 
); 
routes.MapRoute(
    "Location", 
    "{city}", 
    new { controller = "Location", action = "Index", city = "Mumbai" } 
); 

これにより、他のコントローラはまだ動作し、場所も同様に機能します。問題はもちろん、あなたの通常のコントローラの名前と同じ都市名がある場合です。 :)しかし、あなたはそれを制御することも避けることもできます。