電子書籍の厳選無料作品が豊富!

ASP.NET MVCで開発しています。
型付けHTMLヘルパーが上手く理解(というか納得?)できないので
どうかご教授願います。

ところで、事前にこちらのページを覗いております。
http://www.atmarkit.co.jp/fdotnet/scottgublog/20 …

さて、本題。

<%= 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点の利点を実現する」ことと、「ラムダ式の記述」というのがどうも一致しません。
開発作業には支障ないのですが、腑に落ちなくて困っています。
ソースコードを読んでも、自分の疑問の解決には至りませんでした。
どうぞよろしくお願い致します。

A 回答 (2件)

どうしてそうなってるか、といった仕様とかはわかりませんから、情報だけ。



ASP.NET MVCはソースコードが提供されています。
ASP.NETのコアな部分はでてませんが、HTMLヘルパーのあたりはすべて読めたはず。
そのあたりを参考に独自のヘルパー作ったりしましたから。

ソースコードを読み込んでみれば、どう使っているか、とか理解できることもあるんじゃないですかね。
    • good
    • 0
この回答へのお礼

onos様
ご回答いただきありがとうございます。

ソースコードは一通り読みました。その上で、「○○For」のHTMLヘルパーを使うことの
利点、どんなときにどんな風に使うことで、旧来HTMLヘルパーでは到底なし得なかったことが
実現できるのか?という部分がわからず、質問させていただいた次第です。

お礼日時:2012/06/18 13:50

ラムダ式はデリゲートなので、実行時にリフレクションで属性情報を取得できます。


一方で、下記のように

<%= Html.Textbox(Model.ProductName) %>

単純な値を渡されても、開発時のインテリセンスは効くかもしれませんが、実行時に呼び出された側からするとそれはただのパラメータ値でしかないので。。。

といったところではないかと思います。
    • good
    • 0
この回答へのお礼

edp3142様
ご回答いただきありがとうございます。

>単純な値を渡されても、開発時のインテリセンスは効くかもしれませんが、
>実行時に呼び出された側からするとそれはただのパラメータ値でしかないので。。。

なるほど。そういう違いが考えられますね。

ただそうなるとまた別の疑問が沸いてきまして・・・。
私としてはHTMLヘルパーはパラメータの値をもらってHTMLを組み立てるだけの存在なので、
モデルオブジェクトの属性って必要ないんじゃないか?・・・、と思うのですが・・・。

たとえば、モデルクラスのアノテーションにしたがって事細かなHTMLなりJavaScriptなりを
生成してくれる・・、とかしてくれるのでしょうか?

しつこく尋ねて申し訳ないのですが、ラムダ式を使った場合でないと得られない利点、
および、そういうサンプルがありましたら、お教え願えませんでしょうか?
宜しくお願いします。

お礼日時:2012/06/15 10:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!