redwarrior’s diary

C#, ASP.NET, WEB, G*などの雑多な情報

ASP.NET MVCのコントローラ引数とパラメータのバインディングについて

Visual Studio 2013を使用して、プロジェクトを作成し、Scaffoldで作成されたASP.NET MVC 5アプリケーションを調査しました。

コントローラクラスの役割

コントローラクラスは以下を行っています。

  • コントローラクラスのメソッドとURLのパスを属性や規約を利用して紐づけ、処理を行うメソッドを決定します。

  • メソッド内でデータ操作やサービス呼び出しを行った後、返り値でリダイレクト先やVIEWを指定します。

メソッドの引数と、フォームパラメータの大文字小文字の差異について

アプリケーションのソースコードを読んでいると気になることがあります。それはフォームパラメータの名前とコントローラクラスの引数名の大文字・小文字の違いです。

C#では、メソッドのパラメータ名は小文字始まりが推奨されています。ところがアプリケーションを起動し、表示されたHTMLを見てみると入力フォームのパラメータ名は大文字始まりになっています。

これはHTMLを作成するときにヘルパークラスのメソッドにモデルオブジェクトのプロパティを指定してるためであり、 C#では、クラスのプロパティは、大文字始まりが推奨されているからです。

Scaffoldしたソースは変更しておらす、動作も正常なので、パラメータのバインディング時に、フレームワーク側で上手く吸収しているのだと思いますが、気になったので調べました。

調査結果

  • ControllerクラスのRequestプロパティが持つParamsプロパティに、フォームパラメータが格納されています。この時、パラメータ名はそのまま格納されています。(大文字ならば大文字)
  • Paramsプロパティの型は、NameValueCollectionクラスであり、キーの比較条件には CaseInsensitiveComparer クラスを使用します。
  • CaseInsensitiveComparer クラスは、比較時に大文字・小文字を区別しません。

よって、フォームパラメータにPascal形式(先頭大文字)、メソッドの引数にCamel形式(先頭小文字)を使用していてもバインディングが可能になります。

なるほど。これんならば、ヘルパークラスのメソッドを使わずに、HTMLを直書きした場合でも、同様に大文字小文字は無視して、バインディングが行われそうですね。勉強になりました。