• 締切済み

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

みんなの回答

  • onos
  • ベストアンサー率81% (127/155)
回答No.2

どうしてそうなってるか、といった仕様とかはわかりませんから、情報だけ。 ASP.NET MVCはソースコードが提供されています。 ASP.NETのコアな部分はでてませんが、HTMLヘルパーのあたりはすべて読めたはず。 そのあたりを参考に独自のヘルパー作ったりしましたから。 ソースコードを読み込んでみれば、どう使っているか、とか理解できることもあるんじゃないですかね。

gongon8
質問者

お礼

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

noname#259269
noname#259269
回答No.1

ラムダ式はデリゲートなので、実行時にリフレクションで属性情報を取得できます。 一方で、下記のように <%= Html.Textbox(Model.ProductName) %> 単純な値を渡されても、開発時のインテリセンスは効くかもしれませんが、実行時に呼び出された側からするとそれはただのパラメータ値でしかないので。。。 といったところではないかと思います。

gongon8
質問者

お礼

edp3142様 ご回答いただきありがとうございます。 >単純な値を渡されても、開発時のインテリセンスは効くかもしれませんが、 >実行時に呼び出された側からするとそれはただのパラメータ値でしかないので。。。 なるほど。そういう違いが考えられますね。 ただそうなるとまた別の疑問が沸いてきまして・・・。 私としてはHTMLヘルパーはパラメータの値をもらってHTMLを組み立てるだけの存在なので、 モデルオブジェクトの属性って必要ないんじゃないか?・・・、と思うのですが・・・。 たとえば、モデルクラスのアノテーションにしたがって事細かなHTMLなりJavaScriptなりを 生成してくれる・・、とかしてくれるのでしょうか? しつこく尋ねて申し訳ないのですが、ラムダ式を使った場合でないと得られない利点、 および、そういうサンプルがありましたら、お教え願えませんでしょうか? 宜しくお願いします。

関連するQ&A

  • 【ASP.NET MVC】フォームヘルパーの是非

    いつも大変にお世話になっています。 今回も例によってASP.NET MVCの質問です。 ASP.NET MVCでは、Htmlヘルパーを使用してビューを記述するのが常識かと思います。 例) @Html.Textbox("name", Model.name) 今回、デザイナが加わる仕事で、完成後にデザイナ側でフォーム訂正が必要になることが予想されます。 またその際、デザイナから「できるだけ独自仕様(Lazorのこと?)のテンプレートを使用しないように」とのお達しがあったため、苦慮しております。 質問です。 Htmlフォームヘルパーを使わずに、純粋なHTML記述を行った場合、どのような支障が考えられますか? 要件: @Html.Textbox("name", Model.name) と書かずに。 <input type="text" id="name" name="name" /> と(HTML展開後の文法で)書く場合の違いを知りたい です。同じ動作をするのでしょうか?また、違いの程度は? です。なにとぞよろしくお願いします。

  • 【ASP.NET MVC】HTMLヘルパーについて

    VisualStudio2010 ASP.NET MVC4.0で開発しています。 検索条件を入力欄から入力し絞り込みさせ、結果を表示する照会画面を作成しています。 ある理由から「入力欄の値をPostで受け取りController内でその値を書き換えさせ、 Viewに戻り、書き換わった状態で入力欄を表示させたい」という事をしたいのですが、 ラムダ式で行うと書き換えが無効になり入力値のままになってしまいます。 @Html.TextBoxFor(model => model.Crdate,) 以下で表現するとキチンとController内の書き換えが有効になって表示されます。 @Html.TextBox("Crdate", Model.Crdate) 解析してみたところTextBoxForの第一引数HtmlHelperの htmlHelper.ViewData.ModelState.Valuesが入力状態を持っていて それがある場合に優先されているのかな?という憶測が立っています。 (初期表示の時点のhtmlHelper(htmlHelper.ViewData.ModelStateにKeyがない状態)をセッションに保存させPost後、画面で表示する際にセッションから上書きしてやるとちゃんと値が変わったため) バリデーションチェックの関係上出来ればラムダ式のHelperForの形でやりたいのですが、 方法がありますでしょうか? よろしくお願いいたします。

  • 【ASP.NET MVC】一覧編集画面

    いつもお世話になります。 ASP.NET MVCを使って構築中のサイトで、また暗礁に乗り上げております。 商品一覧の画面で、一覧表示のままCRUD(追加・更新・削除)するインターフェースを客先から求められております。 一覧表示 → 個別画面でのCRUDはできていますが、画面遷移が面倒ということで却下されました。 ASP.NETでいう、GridViewのようなテイストです。 (各行にテキストボックス・更新ボタン・削除ボタン) モデルはこんな感じです(簡略化してあります。実際にはご教示いただいたカスタム検証もあります) public class Lady {  public int ID { get; set; }  public string name { get; set; }  public int areaID { get; set; }  public int salesAmount { get; set; } } public List<Lady> ladies; 一覧表部分のビューはこんな感じです(細かい点は省略です) @foreach (var lady in Model.ladies){  @using(Html.BeginForm("UpdateLady","Admin")) {   @Html.Hidden("ID", lady.ID)   @Html.TextBox("name", lady.name)   @Html.DropDownList("areaID", new SelectList(model.areas, "areaID","areaName", lady.areaID))   @Html.TextBox("salesAmount",lady.salesAmount)   <!-- 以降不明 -->   <input type="submit" value="更新"/>   <input type="submit" value="削除"/>  } } コントローラ class AdminController {  public EditLady(){   var model = new EditLadyView();   return View("EditLady", model);  }  [HttpPost]  public UpdateLady(Lady lady){   if (ModelState.IsValid){    // 更新    // lady.IDをキーにしてDBを更新   } else {    // 再表示 <!-- ここがわからない -->   }  }  [HttpPost]  public DeleteLady(int ID){   // 削除   // IDをキーにしてDBを削除  } } 質問点は以下の通りです。 ■表示はOKですが、できたhtmlを見ると、各行の項目が同じid / name名になります。これで正しいですか? ■同じForm内に更新ボタンが複数あった場合、formのPOST先を変える必要がありますが、javascriptを使うのでしょうか? ■検証失敗時、全体を再表示するにはどういった方法があるでしょうか? 読み直すと入力した値が消えてしまいます。 会社にMVCの経験者がおらず、苦労しています。 なにとぞお助けください。

  • HTMLの記述の意味を教えてください

    ホームページ作成の勉強をしています あるページのHTMLを見ていると <a name="anka" id="top">北海道の旅</a>   という記述がありました nameだけ idだけというのはわかりますが両方を記述してあるのはどういう意味なのでしょうか よろしくお願いします

  • HTML::TemplateのTMPL_LOOPについて

    PerlモジュールのHTML::Templateを利用していますが、多重ループの書き方がわかりません。 以下のようなループがある場合、どのようにperlを記述したらいいでしょうか。 <TMPL_LOOP NAME=LOOPA> <TMPL_VAR NAME=title> <TMPL_LOOP NAME=LOOP_GUEST> <TMPL_VAR NAME=guest_name> </TMPL_LOOP> <TMPL_VAR NAME=time> </TMPL_LOOP> ドキュメントを見ると下記のように記述するようですが、下記を値それぞれではなく、配列を利用する場合にはどのように記述すれば良いでしょうか。 $template->param(LOOP => [ { name => 'Bobby', nicknames => [ { name => 'the big bad wolf' }, { name => 'He-Man' }, ], }, ], );

    • ベストアンサー
    • Perl
  • HTML内の{}の意味

    FC2ショッピングカートのテンプレートを変更したいのですが、 title>{shop_name}</title> <link rel="stylesheet" type="text/css" href="{css_link}" media="screen,tv" title="デフォルト"> こんな感じで、{}という記述が出てきます。Smartyかなとも思ったんですが、{$css_link}ならわかるんですけど、$が付いてません。以下のHTML内にはこれが多数出てきて、編集仕方がわからず困っています。 テンプレート変数の意味については、FC2のリファレンスに載っていたのですが、テンプレート変数自体を書き換えたいのです。 一体何の言語なんでしょうか?

    • ベストアンサー
    • HTML
  • HTMLとJavascriptの汎用的な書き方について

    HTMLのタグにid="namae"とすれば、Javascriptでdocument.getElementByIdを使って平面状に(すべてdocumentの下?)でアクセスできるので、 getElementByIdは便利かなと思っているのですが、 タグで name属性を使ってアクセスする場合と、 id属性でgetElementByIdでアクセスする場合の どちらが今後一般的になるのでしょうか? nameは昔から?あったようなので、切り捨てるのも 気になりますが、記述の面で両方書くと手間なので、 id属性で一本化しても問題ないでしょうか?

  • XHTMLとHTMLの違いについて

    XHTMLのHTMLの違いについて教えてください。 勉強するものの、これといった違いが判らずにこまってます。 (今のところ、HTMLとは記述方式が違うんだよ~とか、XMLの宣言が必要なんだよ~、ということはわかったのですが) (参考したURL) http://www.atmarkit.co.jp/fxml/askxmlexpert/022xhtml/22xhtml.html HTMLとXHTMLの違いとして以下の点が挙げられていることがわかりました。 ----------------------------------------------------------------- 1.文書は整形式でなければならない 2.要素名及び属性名は小文字でなければならない 3.非空要素には終了タグが必要である 4.属性値は常に引用符で括られなければならない 5.属性の省略化はしてはならない 6.meta、hr、br、img などは、空要素として書く 7.属性値内での改行を含む複数の空白は1つと見なす 8.スクリプトおよびスタイル要素の定義が異なる 9.要素の入れ子などSGMLの排除機能を再現できない 10.‘id’および‘name’属性をもつ要素は、‘id’属性を使用する ----------------------------------------------------------------- とあるのですが、違う部分っていうのは「こういった定義部分だけ」であって、動作として大きな違い「ここが違うんだ」といった部分はないのでしょうか? 「書式が厳密になっています。」言葉から、XHTMLは「HTMLをより厳密に書くもの」ということなのでしょうか? また、10番目の、 「‘id’および‘name’属性をもつ要素は、‘id’属性を使用する 」について、イメージできなかったのですが、一体何のことを言っているのでしょうか? 例えば、JavaScriptを使用して、要素を操作する場合は、 getElementById("ID名")にて、操作を行うべきである、と言っているのでしょうか?

    • ベストアンサー
    • HTML
  • のでしょう?

    ラムダ式の説明やサンプルソースにはよく、OrderBy(x => x.Name) といったようにxが出てきますが、このxとはなんなのでしょう? Name以外にもいろんなプロパティがインテリセンスで出てきますが、 これはクラスですか?どこで宣言されているものですか?ただの変数ですか?

  • 動的にHTMLを書き換えたい

    ボタンを押したタイミングでHTMLを書き換えたいと思っています。 <div id='view'>・・・・</div> のように<div>タグで指定した範囲内を書き換えたいです。 この部分には、ただのテキストを表示するのではなく、変数に入れてあるHTMLタグの内容を表示します。 viewMsg[1] = "<input type='button' value='追加' name='BTN_APPEND' onclick=\"doSubmit('BTN_APPEND')\">aaaaaa"; viewMsg[2] = "<input type='button' value='追加' name='BTN_APPEND' onclick=\"doSubmit('BTN_APPEND')\">bbbbbb"; viewMsg[3] = "<input type='button' value='追加' name='BTN_APPEND' onclick=\"doSubmit('BTN_APPEND')\">cccccc"; ボタンを押すと変数が確定し、変数の値を<div>部分にセットしたいと思っています。 どのように実現すればよいでしょうか?

専門家に質問してみよう