ASP.NET MVCのHTMLヘルパーについての質問

このQ&Aのポイント
  • VisualStudio2010 ASP.NET MVC4.0で開発しています。検索条件を入力欄から入力し絞り込みさせ、結果を表示する照会画面を作成しています。ラムダ式で行うと書き換えが無効になり入力値のままになってしまいます。
  • 解析してみたところTextBoxForの第一引数HtmlHelperのhtmlHelper.ViewData.ModelState.Valuesが入力状態を持っていて、それがある場合に優先されているのかな?バリデーションチェックの関係上出来ればラムダ式のHelperForの形でやりたいのですが、方法がありますでしょうか?
  • ラムダ式でのHelperForの形で書き換えを有効にする方法はありますか?
回答を見る
  • ベストアンサー

【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の形でやりたいのですが、 方法がありますでしょうか? よろしくお願いいたします。

質問者が選んだベストアンサー

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

ちょうど最近MSDNフォーラムで話題になってたのと、原因としては同じこと、かな。 http://social.msdn.microsoft.com/Forums/ja-JP/aspnetja/thread/052bdb45-17b3-4478-af38-eebb5c3f63b7 ModelState.Clear(); してから Modelの値を変更することでうまく動くようになるかと。

arisutoteresu
質問者

お礼

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

関連するQ&A

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

  • MVC構成 コントローラに指定すべき内容

    MVC構成でビューは主にHTML, モデルではバリデーションなどをプログラミングするかと思います。 コントローラではレイアウトの指定など以外にどのような内容を指定するのが適切でしょうか?

    • ベストアンサー
    • PHP
  • 【ASP.NET MVC3】コントローラの状態

    いつも大変にお世話になります。 今作っているASP.NET MVC3 Webアプリケーションで、複数のコントローラから呼び出される、共通のクラスとメソッドを作っています。 その中から、コントローラ(具体的にはセッション情報)に値をセットしたいです。 すごく単純化しますと、コントローラがHomeControllerとMemberControllerとして、 public WorkerService {  public SetSessionValue(???){   // 呼び出し元がHomeControllerなら、Session["HomeDt"]に日付をセット   // 呼び出し元がMemberControllerなら、Session["MemberDt"]に日付をセット  } } ていうメソッドを呼び出しています。 英文の記事を見て、ControllerContextという静的クラスを使えばいいのは感覚的にわかったのですが、具体的なコーディングとなるとさっぱりです。 これができると、何かMVCでも光が見えそうな気がします。現在はお先真っ暗ですが。 どなたか教えてやっていただけないでしょうか。お願いします。

  • 【ASP.NET MVC】モデルの作り方

    ASP.NET MVCでのモデルについて、皆様はどのように作成しておられますか? ASP.NET MVCで何本かWebシステムを構築して、いまだに試行錯誤です。 サンプル例を見ても、実際とはかけ離れた簡単な内容で、あまり参考になりません。 自分が見たいくつかのサイトではこのように書いてありました。 ドメインモデル データベースと1:1で存在する入出力用のモデル。EntityFrameworkで定義する。 拡張ドメインモデル ドメインモデルにプロパティを追加したり、複数のモデルを使いやすくまとめたモデル。 ビューモデル 画面表示するためのモデル。 フォームモデル フォーム入力値を受信するためのモデル。 理屈はわかるのですが、このように4種類もモデルを定義するものなのでしょうか? モデル間のデータのやりとりも大変ですし、定義だけで作業量が半端ない感じです。 継承などをうまく使って省力化する方法とかありますか? 皆さまの方法論をお聞きしたくお願い申し上げます。 ASP.NET MVCに限らず、CakePHPなどの例でも歓迎です。

  • 【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の経験者がおらず、苦労しています。 なにとぞお助けください。

  • ASP.NET MVC 3

    画面上のエディットボックスに入力した値を取得してコントローラーに引き渡すにはどうすればよいでしょうか? ご存知の方、よろしくお願いします。

  • PHPとHTMLを使って(早急にお願いします)

    はじめまして。 課題のデータが消えてしまい早急の提出物になるので 丸投げになるんですがどうかよろしくおねがいします。 ブラウザのフォームを使って携帯電話の形式チェックが行えるようにする。 フォームの内容 1、入力欄 形式:test name値:mobile value値:空(初期値) 2、サブミットボタン value値:確認する 3、フォームメソッド post 携帯番号入力後「確認する」ボタンを押す (1)入力フォーム再表示 (2)入力フォームのmobileの欄に入力した携帯番号表示 (3)入力した値が携帯番号の形式だったら「携帯番号です」と画面表示 (4)入力した値が携帯番号ではない場合「携帯番号じゃありません」と画面に出力 ファイル名 mobile.php ※PHPでpostメソッドを利用して送信したデータはスーパーグローバル変数の$_POSTに格納される よろしくお願いします。

    • 締切済み
    • PHP
  • RailsのMVCモデルに関しての基本的な質問

    お世話になります、Railsに関して一通り入門書を読んだのですが、MVCモデルに関してご教示頂きたいのですが、現状LinusサーバにRubyGemがインストールされているので、WEBのトップページにも活用しようと考えているのですが、基本的な質問で恐縮なのですが、そもそも、MVCモデルは外部からのイベント(通常はユーザ入力)を受け取り、モデルとやり取りし、適切なビューをユーザに表示するというのが基本的な動作かと思いますが、その外部からのイベントがない静的なWEBページを作成する場合は、特にコントローラを作成する必要はないと考えて良いのでしょうか。 現状、spinelzと部分テンプレートのWEBページ作成を検討しています。データベース等はもちろん使用しません。

  • php+mysqlでデータを表示更新削除するシステムを製作中ですが

    PHP+MYSQLでデータを取り出し、入力変更を行うシステムを製作しているのですが、 取り出したデータを保持してのページ遷移ができません。 どのように行えばよいのでしょうか? 製作中のシステムの条件は以下の通りです。 ・MYSQLから取り出したデータはクラスに保持する。 ・フレームワークは使用しない。 ・セッションは使用しない。 ・直接ページ遷移するのではなくMVCモデルのように 一度コントローラ部のような所に遷移し変更削除の確認画面に遷移する。 入力画面←→コントローラ部←→確認画面 のような感じです ・確認画面から入力画面に戻った時、入力変更した項目は表示する。 以上です。自分で調べた限りではセッションを使用しないと不可能のような気がしますが・・・。

    • 締切済み
    • PHP
  • ASP.NET MVC 3 に詳しい方

    WebGridで作った表に、検索機能ボタンを押して動的にテーブルに表示するデータを変えるにはどうすればよいでしょうか? http://blogs.itmedia.co.jp/tamaki/2010/10/aspnet-mvc-3-85.html 上記のサンプルで作った表にはトドウフケンやフリガナといった列名がありますが、たとえばこの画面にトドウフケンやフリガナを入力するエディットボックスと、検索ボタンをつけ、ボックスに入力した値をSQLのwhere文に追加して、テーブルの内容を絞り込めるようにするにはどうすればよいでしょうか? 詳しい方のアドバイスお待ちします。よろしくお願いします。

専門家に質問してみよう