none
ASP.NET MVC ルーティングでパラメータが渡らない RRS feed

  • 質問

  • 現在、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

    2011年3月9日 0:10

回答

  • ルート定義には記述順序が関係していますので、"Default" の定義の前に "QAAnser" の定義を書く必要があります。
    あと、"QAAnser" の定義にコントローラーの指定がありませんので、そのままだと実行時にエラーが出ると思います。
    • 回答としてマーク テッテ 2011年3月9日 3:31
    2011年3月9日 2:23

すべての返信

  • ルート定義には記述順序が関係していますので、"Default" の定義の前に "QAAnser" の定義を書く必要があります。
    あと、"QAAnser" の定義にコントローラーの指定がありませんので、そのままだと実行時にエラーが出ると思います。
    • 回答としてマーク テッテ 2011年3月9日 3:31
    2011年3月9日 2:23
  • ご指摘通りでした。以下のように修正して解決しました。

    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パターンの中にないので不要かと思って削除したのですが、ご指摘の通りエラーとなり、修正しました。

    ありがとうございました。

    2011年3月9日 3:30