- 締切済み
【ASP.NET MVC】HTMLヘルパーについて
ASP.NET MVCで開発しています。 型付けHTMLヘルパーが上手く理解(というか納得?)できないので どうかご教授願います。 ところで、事前にこちらのページを覗いております。 http://www.atmarkit.co.jp/fdotnet/scottgublog/20100113stronghelper/stronghelper.html さて、本題。 <%= Html.TextBoxFor(model => model.ProductName) %> というのが、 <input type="text" id="ProductName" name="ProductName" value="*model.ProductNameの値*"/> となるのは何となく理解ができます。 理解できるということの根拠として、id(およびname)の「ProductName」はまさに 記述されていますし、ラムダ式はmodel.ProductNameを返すようになっているから、 「.NETはnameとidとvalueを取得できるんだろうよ」、と予想できるからです。 旧来のHtmlヘルパー <%= Html.Textbox("ProductName",Model.ProductName) %> に比べて、 「name(id)属性用のパラメータが必要無い」 「テンプレート内でのコードインテリセンスが効く」 という利点があるそうですが、どうしてもここで納得出来ないことがあります。 この2点の利点を実現するのに、なぜラムダ式で実現できるのでしょうか? あるいは、なぜラムダ式が採用されたのでしょうか? 別の言い方をすれば、別にラムダ式を用いなくても、.NETが賢くなれば、 <%= Html.Textbox(Model.ProductName) %> という記述で、インテリセンスが効いてコンパイルチェックも実行されても おかしく無いと思うのですが・・・。 Modelオブジェクトの型宣言はテンプレートの先頭で行われているはずですから、 「Model.」と打ったところでModelのクラスと関連付いてもおかしく無いですよね? 別にMSの仕様に文句をつけるつもりはないのですが、 「先述の2点の利点を実現する」ことと、「ラムダ式の記述」というのがどうも一致しません。 開発作業には支障ないのですが、腑に落ちなくて困っています。 ソースコードを読んでも、自分の疑問の解決には至りませんでした。 どうぞよろしくお願い致します。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- onos
- ベストアンサー率81% (127/155)
どうしてそうなってるか、といった仕様とかはわかりませんから、情報だけ。 ASP.NET MVCはソースコードが提供されています。 ASP.NETのコアな部分はでてませんが、HTMLヘルパーのあたりはすべて読めたはず。 そのあたりを参考に独自のヘルパー作ったりしましたから。 ソースコードを読み込んでみれば、どう使っているか、とか理解できることもあるんじゃないですかね。
ラムダ式はデリゲートなので、実行時にリフレクションで属性情報を取得できます。 一方で、下記のように <%= Html.Textbox(Model.ProductName) %> 単純な値を渡されても、開発時のインテリセンスは効くかもしれませんが、実行時に呼び出された側からするとそれはただのパラメータ値でしかないので。。。 といったところではないかと思います。
お礼
edp3142様 ご回答いただきありがとうございます。 >単純な値を渡されても、開発時のインテリセンスは効くかもしれませんが、 >実行時に呼び出された側からするとそれはただのパラメータ値でしかないので。。。 なるほど。そういう違いが考えられますね。 ただそうなるとまた別の疑問が沸いてきまして・・・。 私としてはHTMLヘルパーはパラメータの値をもらってHTMLを組み立てるだけの存在なので、 モデルオブジェクトの属性って必要ないんじゃないか?・・・、と思うのですが・・・。 たとえば、モデルクラスのアノテーションにしたがって事細かなHTMLなりJavaScriptなりを 生成してくれる・・、とかしてくれるのでしょうか? しつこく尋ねて申し訳ないのですが、ラムダ式を使った場合でないと得られない利点、 および、そういうサンプルがありましたら、お教え願えませんでしょうか? 宜しくお願いします。
お礼
onos様 ご回答いただきありがとうございます。 ソースコードは一通り読みました。その上で、「○○For」のHTMLヘルパーを使うことの 利点、どんなときにどんな風に使うことで、旧来HTMLヘルパーでは到底なし得なかったことが 実現できるのか?という部分がわからず、質問させていただいた次第です。