このルートをMVC3アプリケーションで機能させようとしていますが、actionメソッドは常にnullパラメーターを取得します。
一般的な考え方は、私のルートには必須パラメーター「category」とオプションパラメーター「city」があるということです。可能性のあるリクエストURLは次のようになります。
/Map/SelectCategory/Restaurants
/Map/SelectCategory/Restaurants/Washington
このルートは、JSONデータを返すことを目的としています。これは、JSONデータがWebサービスとして使用されるためです。これは、通常のWebページ用であり、正常に機能する、この後に定義した標準の/ Map/Categoryアクションとは異なります。
したがって、私のルートはGlobal.asaxで次のように定義されています。
routes.MapRoute( // Map It! Controller
"MapSvc", // route name
"Map/SelectCategory/{catID}/{city}", // URL with parameters
new { controller = "Map", action = "SelectCategory", city= UrlParameter.Optional }
);
.. Here a route for /Map/Category/{id} ..
.. Here a route for /Map/Placemark/{id} ..
私の知る限り、ルート定義で「catID」を省略できます。これは、オプションではないことが自動的にバインドされるためです。それを定義してみましたが、同じ結果です。
最後になりましたが、コントローラーでの私のアクションは次のように定義されています。
public ActionResult SelectCategory(string catID, string city)
{
IEnumerable<Models.Placemark> list;
if (!string.IsNullOrEmpty(city)) {
list = doThis();
} else {
list = doThat();
}
return Json(list);
}
アクションの最初のステートメントにブレークポイントを設定しましたが、ルート(/ Map / SelectCategory / Restaurants)に記載されているURLをリクエストすると、カテゴリと都市のパラメータの両方がNULLであることがわかります。この場合、カテゴリが必要です。パラメータは「レストラン」になります。
ソリューション 注:100ポイントの評判がないため、回答を投稿するのに6時間待たなければならず、実際に行かなければなりません。
私を正しい方向に導いてくれた@tsegayに感謝します。Global.asaxで定義された他のすべてのルートには、パラメーターを含む明示的なURLがありましたが、この場合、デフォルトルート(空のソリューションテンプレートで作成された標準ルート)が貪欲すぎるために問題が発生しました。
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional}
);
Global.asaxのルートリストの最後に移動しましたが、問題は解決しました。私を正しい方向に導いてくれてありがとう。