トップ回答者
ASP.NET MVC ルーティングでパラメータが渡らない

質問
-
現在、ASP.NET MVC の学習をしています。
初歩的なことだとは思うのですが、ルーティングのパラメータ渡しが上手くいかず、
原因がどうしてもわからないので、質問させていただきます。実現したいことは、以下のような URL で、コントローラのメソッドを呼び出し、
メソッドの引数 entryId に「1」というパラメータを渡すことです。[URL]
http://省略/QAAnswer/Create/1
Global.asax.cs と、コントローラのソースは以下のようになっています。[Global.asax.cs]
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Default", // ルート名 "{controller}/{action}/{id}", // パラメーター付きの URL new { controller = "Home", action = "Index", id = UrlParameter.Optional } // パラメーターの既定値 ); routes.MapRoute( "QAAnswer", // ルート名 "QAAnswer/{action}/{entryId}", // パラメーター付きの URL new { action = "Create", entryId = 1 } // パラメーターの既定値 ); }
[Controllers/QAAnswerController.cs]
public ActionResult Create(int? entryId) { // この時点で entryId に null が入ってくる // 「1」が渡ってきてほしい ...(省略) }
Create が呼び出されるのですが、デバッガで確認すると、entryId には null が入っています。
「QAAnswer/{action}/{entryId}」への MapRoute を定義しましたので、
この定義にしたがって、entryId という引数に URL の最後のスラッシュ以降のものが
渡されると考えたのですが、何か思い違いをしているでしょうか?
よろしくお願いします。
Visual Studio 2010 Professional Edition / C# / ASP.NET MVC 3
回答
すべての返信
-
ご指摘通りでした。以下のように修正して解決しました。
routes.MapRoute( "QAAnswer", // ルート名 "QAAnswer/{action}/{entryId}", // パラメーター付きの URL new { controller = "QAAnswer", action = "Create", entryId = 1 } // パラメーターの既定値 ); routes.MapRoute( "Default", // ルート名 "{controller}/{action}/{id}", // パラメーター付きの URL new { controller = "Home", action = "Index", id = UrlParameter.Optional } // パラメーターの既定値 );
順序が関係あるとは盲点でした。{controller}/{action}/{id} にもマッチしていたので、そちらが適用されていたのですね。
また、第3引数の controller は、URLパターンの中にないので不要かと思って削除したのですが、ご指摘の通りエラーとなり、修正しました。
ありがとうございました。