ASP.NET MVC Modelの検証

このQ&Aのポイント
  • ASP.NET MVCのModelの検証について教えてください。
  • エンティティの種類と処理の流れについて説明します。
  • 一時エンティティの検証方法について、お困りのようです。
回答を見る
  • ベストアンサー

ASP.NET MVC Modelの検証

Modelの検証について教えてください。 エンティティが下記の三種類あります。 ・AModel(POSTデータ格納) ・BModel(POSTされたAModelの情報等を基に作成する一時エンティティ) ・CModel(DBのテーブルと対応する、保存対象エンティティ) とあるPOSTデータをDBに保存するアクションで、処理の流れは下記のとおりです。 1.POSTデータの検証(アクションの引数でAModelとして取得) 2.POSTデータをもとに、一時エンティティ(BModel)を作成 3.一時エンティティの検証(検証ルールはModel内に記述)←☆ 4.一時エンティティを基に、保存用エンティティ(CModel)を作成 5.保存用エンティティを検証 6.DBに保存用エンティティをSave 方法がわからないのが3での検証方法です。 1の検証については、アクション処理が行われる前にModelStateに検証結果が格納されます。 5の検証については、DbContextのGetValidationResultで検証結果が取得されます。 3の検証はどのようにすべきでしょうか? 5と同様にすることも考えられますが、DBと直接関連付けられるエンティティでもないため、 DbContextを使用するのに違和感を感じてしまいます。

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

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

BModelのインスタンス作ってTryUpdateModelにそのインスタンス渡せば、検証がOKかどうか判断できて、NGのときの情報はModelStateに入るんじゃないかな。 未確認ですが。

tattetatte
質問者

お礼

ありがとうございます。Controllerのメソッドを調べると TryUpdateModel TryValidateModel などがあり、これらを使うことで任意のタイミングでValidateが行え、 結果もModelStateに格納されることを確認しました。

その他の回答 (1)

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

BModelをどう作るか、という話ですかね? 普通にPOCOのクラスつくってDataAnnotationとかで検証のための属性付加する、ではいけないでしょうか? ASP.NET MVC2 のころの情報が役に立つように思います。

tattetatte
質問者

補足

ご回答ありがとうございます。 BModelの作りについてですが、POCOクラスでDataAnnotationで検証の 属性を付与しています。 疑問に思っているのは 「任意のタイミングでBModelのValidationのみ行うにはどうすればよいか」 ということです。 もしもBModelがDbContextに登録されているのであれば、DbContext を経由したBModelのDB保存時に自動でValidationがかかりますし、 またGetValidationResultで任意のタイミングでValidationをかけることも 可能です。 先入観としてDbContextはDBと関連付くEntityのみに使用するという 印象があるのですが、素直にValidationをかける場合はContext経由で 行うとしたほうが良いのでしょうか? Entityのオブジェクトを渡すと、そのEntityのValidationを行ってくれる、 というような静的なメソッドがあれば良いのですが…

関連するQ&A

  • ASP.NET MVC エンティティモデルの定義

    ASP.NET MVC コードファーストでの質問です。 エンティティモデルを定義する際、実際のテーブル構造と異なるモデルを 定義することは可能でしょうか? Imports System.ComponentModel.DataAnnotations Public Class SampleData Public Property Height As Long //実際に存在するカラム <Column("Taiju")> _ Public Property Weight As Long //実際に存在しないカラム(ただし「Taiju」というカラムが存在する) Public Property Bmi As Long //実際に存在しないカラム End Class カラム名が違う場合(上記Weight)、Column属性を指定すれば、指定カラムからデータを取得してくれます。 実際に存在しないカラム(上記Bmi)を定義した場合、このままですとデータ取得時に 「System.Data.SqlClient.SqlException: 列名 'Bmi' が無効です。」となります。 データ取得時にBmiを取得対象外としたいのですが、そのようなことは可能でしょうか? BmiをPrivate変数としてgetter./setter用Functionを定義すれば回避は可能なのですが、 スマートではないので、属性の指定等で対応できればと考えております。

  • Java Struts MVCモデル 正しい書き方

    Java Struts1.3.10 皆でとあるシステムを作ることになったのですが、 JSP・ActionForm・Actionそれぞれの関係の在り方について悩んでいます。 ログイン機能を例とします。 1機能、1Form、1Actionとした場合は: 1.Login.jspでIDとPASSを入力。 2.LoginResultForm.javaにIDとPASSを格納。 3.LoginResultAction.javaでDBチェック(IDとPASSの存在・権限) 4.Result.jspへ遷移。ID・PASS・権限を表示する 使用するファイルは4つとなります。 1JSP、1Form1、Actionとした場合は: 1.Login.jspでIDとPASSを入力。 2.LoginForm.javaにIDとPASSを格納。 3.LoginAction.javaでDBチェック(IDとPASSの存在) 4.ResultForm.javaにIDとPASSを渡す(Sessionなど) 5.ResultAction.javaでDBから権限を取得、ResultFormに格納 6.Result.jspへ遷移。ID・PASS・権限を表示する 使用するファイルは6つとなります。 現在意見が三つありまして、 1.違うForm同士にデータのやり取りが発生するようであれば(1機能とし)、同じフォームにするべきではないのか? 2.Fromのメンバの数が少ないうちは良いが、今後数が増えると可読性が悪くなるから分けるべきではないのか? 3.フォームは同じでないとまずいが、ActionはJSPごとに分けるべき というものです。 1.ではログイン者情報をセッションに保持することは許可しています。(一部例外を認めている) これらはいずれもStrutsフレームワークの範疇から逸脱している、あるいはMVCモデルに反している、そもそも非効率的ということはないのでしょうか? つまりあくまで実装の仕方の問題でしかない、という結論でよろしいでしょうか?

    • ベストアンサー
    • Java
  • ASP.NET MVCのAjaxフォーム検証

    いつも大変にお世話になります。 今回ご相談させていただきたいのは、AJAXフォーム送信と、検証の仕方ついてです。 画面遷移なしでフォーム内容を送信し、データベースを更新したく思っています。 通常のフォーム検証と送信はできていますが、Ajaxになるとさっぱりわかりません。 欲しい挙動は、 1.Ajaxでフォーム内容を送信(その前に内容の検証 2.サーバサイドでフォーム内容を受け、DBを更新して、結果をjsonで返却 3.クライアント側で結果を受け、画面の一部を書き換え、 この「3」なのですが、書き換える内容がいくつかあるので、ASP.NET AJAXのような"UpdatePanel"は使えません。 あくまでjsonを読む必要がある感じです。 質問なのですが、ここにあるような、「フォームを送信」して、「結果をjsonでもらう」処理は可能なのでしょうか? 結果の取得は非同期?になるような感じですが、Ajaxは対応できるでしょうか? コード例があれば最高ですが、どんな些細なご意見でも構いませんので、拝聴させていただけないでしょうか? 今すぐにコードを完成させなければいけない訳ではないので、若干の余裕がありますが、基本設計や画面設計に関わる部分なので、少し急いでおります。 なにとぞ皆様のお知恵をお貸しください。

  • VB.への入力データをASPで取得するには?

    ASPを始めたばかりなのですが、困っています。 VB.netでつくったexeにユーザーが入力した値を取得してDBに格納、という作業なんですが、データ取得の処理をASPで書くにはどうすればいいのでしょうか? やり方のアドバイス、参考になるサイトなどありましたら、ぜひ教えてください。 よろしくお願いします。

  • DBに格納された画像データを縮小して表示したい

    PHP5+MySQL5です。 DB内のBLOBカラムに、Base64エンコードされた画像データが格納されています。 これを、サムネイル用に縮小して表示したいのですが、widthとheightで小さくするのではなく、ファイルサイズも小さくしてブラウザに渡したいと考えています。 (小さくした画像は保存しません) そこで、DBから取得した画像データを「imagecopyresampled」で再サンプリングしつつ小さくしたいと思いましたが、画面には何も表示されませんでした。 以下、ソースを簡潔に記載します。 $db_img = "DBから画像データを取得"; //600x600の画像 $old_img = base64_decode($db_img); $new_img = imagecreatetruecolor(200,200); //200x200のサムネイル画像を作成 $thumbnail = imagecopyresampled($new_img,$db_img,0,0,0,0,200,200,600,600); print $thumbnail; $old_imgの処理が間違っているのだろうと思うのですが、どのように処理すればいいのかわかりませんでした。 この場合、どのように処理すればいいのか教えていただけないでしょうか? 宜しくお願いします。

    • 締切済み
    • PHP
  • 【ASP.NET MVC】更新アクション

    いつもお世話になっております。 ASP.NET MVCのコントローラで、フォーム送信を受けて動作する更新アクションの作り方について質問させてください。 いろいろな記事やチュートリアルを読んで、なんとか次のような基本計については理解できました。 public class HomeController { [HttpPost] public ActionResult UpdateItem(Item item){  if (! ModelState.IsValid){   TempData["error"] = "入力内容にエラーがあります";   return View("ItemEdit", item);  } else {   var result = false;   //   // 延々と更新メソッドが続く   //   if (result) {     TempData["message"] = "正しく更新できました"     ModelState.Clear();     return Redirect("ItemList");   } else {     TempData["error"] = "更新でエラーが起きました";     return View("ItemEdit", item);   }  } } } TempData["xxx"]の処理は、ビュー側で、値に応じてjQueryUIによりダイアログを表示します。 質問したい箇所は以下の3つです。 ■一体、全体の流れはこれでいいのでしょうか? if文とTempDataばっかりで。。何かスッキリしません。 ■フォーム値の検証はアクション呼び出しの時点で終わっていますが、ここに任意の検証を入れたい場合はどうしたらいいのでしょう? (必須や文字種チェックはモデルで属性設定を行っていますが、それ以外の例えば2項目が連動するような検証) ■サンプルの例文は簡単ですが、DB更新などが伴うと数百行になるため、すごく見通しが悪いです。全部別メソッドにするのも。。いい方法はないでしょうか 不明点だらけですんません(笑 どなたか愛の手を

  • プログラムの考え方とDBの扱いかたについて

    技術的な質問ではなく、考え方についての質問です。 こっちを立てるとあっちが立たずのような状態で困ってます。 どのカテゴリで質問するか悩んだのですが、直近の投稿数が多いのでC言語のところで質問させて頂きます。 ご教示ください。 現在こういうバッチプログラムがあります。 バッチA  > (1)外部から前日分の確定データリストを取得  > (2)データリストに基づいて特定処理の実施  > (3)特定処理の対象になったものをDB(テーブルA)に格納 ※1つのプログラムで3つの処理を行ってます 今度、データリストの取得先に外部2が追加されます。 仕様が同じであれば、バッチAと同様のものを作ればいいのですが、 外部2の場合、1か月の間データが確定されないという仕様があります。 前日分のデータが確定するのは、 1カ月後までの間に取得するデータリストにキャンセルデータが無かった場合です。 1.そこでこのように考えました。 バッチA  > 外部2から1カ月分のデータリストを取得  > 取得データから、1か月前のデータを対象に1ヶ月間キャンセルデータが無いものを抽出する  > (2)データリストに基づいて特定処理の実施  > (3)特定処理の対象になったものをDBに格納 2.でも、毎日1か月分のデータを取得して抽出処理を行うのは負担になるし、 毎日ほぼ同じデータを取得するのはあほらしいと思い、以下のように考えました。 バッチA  > 外部2から前日分のデータリストをDB(テーブルB)に格納  > DBから1か月前のデータを対象に1ヶ月間キャンセルデータが無いものを抽出する  > (2)データリストに基づいて特定処理の実施  > (3)特定処理の対象になったものをDB(テーブルA)に格納 3.今度はそもそもバッチ分けた方がいいんじゃないかと思い、以下のように考えました。 バッチ1  > 外部2から前日分のデータリストをDB(テーブルB)に格納 バッチA  > DBから1か月前のデータを対象に1ヶ月間キャンセルデータが無いものを抽出する  > (2)抽出したデータリストに基づいて特定処理の実施  > (3)特定処理の対象になったものをDB(テーブルA)に格納 4.さらに、キャンセルデータの処理も別バッチにすれば、   バッチAでの処理がわかりやすくなるじゃないかと思い、以下のように考えました。 バッチ1  > 外部2から前日分のデータリストをDB(テーブルB)に格納 バッチ2  > DB(テーブルB)から1か月前のデータを対象に1ヶ月間キャンセルデータが無いものを抽出する  > 抽出したデータのキャンセルデータのレコードをDB(テーブルB)から削除 バッチA  > (1)DB(テーブルB)から前日分のデータリストを取得  > (2)データリストに基づいて特定処理の実施  > (3)特定処理の対象になったものをDB(テーブルA)に格納 ここまで考えてどうするのがスマートなのかよくわからなくなってきてしまいました。 3か4でいこうと思うのですが、3の時にバッチAで抽出処理をするのはいまいちって思ってます。 それで4にしようと思ったのですが、 テーブルBは取得データをそのままの状態で入れておくって当初考えてたので、 それをあとからレコード削除したりするのもどうなんだろうと思ってます。 確定したデータと未確定のデータが混在するのもなんだか腑に落ちません。 それだったら、新たにテーブルCを作って、確定データを突っ込んでおくってことも考えたのですが、 そうなると、バッチA最後に格納しているテーブルAと何も変わらないようなものがもう一つできてしまいます。 どういうのがスマートというか良い考え方なのでしょうか。

  • WEBアプリのMVCについて質問です。

    一般的なフレームワークを用いたMVCについて質問です。 例えばM、これはモデルですね。 普通DBヘの接続はモデルでおこないクエリの発行もモデルで行いますね。 その後、クエリ実行後の結果をコントローラー側に返すと思います。 このとき、普段わたしはモデル上ではDB空の目的のデータをいっさい処理せずそのまま コントローラに返します。 返り値として、何かしらの一覧データを取得するものとします。例えば [ {name : "タロウ" , age : "20","town_id" : 10,"city_id" : 49, "prefecture_id" : 23}, {name : "花子" , age : "20","town_id" : 10,"city_id" : 49, "prefecture_id" : 23}, {name : "邦夫" , age : "20","town_id" : 10,"city_id" : 49, "prefecture_id" : 23} ] といった感じで特定の組み合わせのハッシュを多次元配列(リスト)的にラップしたものがかえりますよね。 そして、上記データをコントーラー側が受け取り、さぁいざビューへと受け渡す際に、どの程度コントローラでデータの 加工を行うものかが気になっています。 たとえば上記データでは「県市町」のデータがユニークなIDとして保持しています。このままでは「タロウ」が どの住所なのかがわかりません。どこかで「県市町」のデータリストを受け取りループで一致する住所を取得する 必要があります。 それをコントローラあるいはビュー・・・・どちらで行うのがMVCとして正しいのでしょうか?多少のループなら ビュー側で行うのもありかとおもいますが、はやりビューがループであふれかえるのは作業しにくいですよね。 MVCの基本だとは思いますが、rubyやPHPなど、フレームワークごとの細かい思想はあるでしょうが 一般的なMVCとしてみるとどうでしょうか? ちなみに、モデル内でjoin などつかって県市町のテーブルをくっつけるのはここでは考えないものとしてください。 個人的にはビュー内では大きなループ一度ですませたいものですが ・・・。

  • MVCモデルのJSPの使い方

    こんにちは。二回目の質問をさせていただきます。 今MVCモデルとJDBCで、社員データをDBにいれる簡単なプログラムを作ろうとしているのですが、初期の段階で躓きました。 サーブレットにてBeanをSessionに関連付けているのですが、いざJSPにてBeanを使おうとするとエラーが出るのです。 JSPのコードは冒頭部分にきちんと下記のものを記述し、 (Beanクラス名はFileBeanです。サーブレットできちんとSessionで関連付けています) <jsp:useBean id="bean" class="FileBean" scope="session" /> JSPの中で、Beanのメソッドを使うようにしているのですが下記のようなエラーが出てしまいます。 org.apache.jasper.JasperException: JSPのクラスをコンパイルできません注: sun.tools.javac.Main は推奨されません。 JSPファイル: /Nyuryoku.jsp の中の行: 3でエラーが発生しました 生成されたサーブレットのエラーです: C:\Apache Tomcat 4.0\work\localhost\SyainData\Nyuryoku$jsp.java:65: クラス org.apache.jsp.FileBean が見つかりません。 FileBean bean = null; ^ 因みに参考書のもので試してみたところ、JSPにおいてBeanを使おうとすると空のHTMLが吐き出され、ブラウザには真っ白な画面が表示されます。JSPのBeanの部分を削除すると、ブラウザには普通にHTMLの部分が表示されるのです。 以上二つのことから、JSPでのBeanの使い方がおかしい、というのはわかったのですが、自分でどう解決して良いのかわかりません。特に参考書のコードはちゃんと市販されているものなので、問題ないと思うのですが… 最後になりましたが、私の環境は Tomcat4.0 で OSはMEになります。 皆様お忙しいとは思いますが、ご教示の程宜しくお願い致します<(_ _)>

    • ベストアンサー
    • Java
  • マスタデータ更新

    こんにちは。 システム開発の基礎的なところがわからないので、教えていただきたく、投稿させていただきます。 システム開発をほとんどやったことがないので、言葉が変なところもあるかと思いますが、宜しくお願いいたします。 サーバー上に、AというSQLServerのDBがあります。 今までは、システム管理者のみがAccessからA.DBのリンクテーブルを使い、マスタデータの更新/追加/削除を行っていましたが、今後、リーダークラスの人もできるようにしたい!という要望があり、そのインターフェース部分を作成しています。 いろいろと考え、フロントエンド側にAccessでB.mdbを作成し、そこには、A.DBと同じテーブル構造の一時TBLを作成し、B.mdbを開いた時にA.DBから全データを取得することにしました。(取得するところまではできています) ここから、設定するための画面作成をしますが、最終的に、更新/追加/削除されたデータは、どのようにA.DBにUPすればいいのでしょうか? 考えた方法として (1)B.mdb内に、一時テーブルとは別に、更に同じ構造の変更用テーブルを作成。 設定画面から更新/追加/削除されたデータは変更用テーブルに保存し、全ての処理が終了したら、変更用テーブルにあるデータを1つづつ見て、A.DBへ更新/追加/削除をかける (2)一時テーブルのデータを直接更新/追加/削除し、全ての処理が終了したら、全テーブルのレコードを1件づつ比較し、A.DBへ更新/追加/削除をかける というくらいしか思いつかないのです。 その他に思ったのが、一時テーブルもしくは変更用のテーブルに、レコード毎に「更新/追加/削除」がわかるようにフラグを設けて、そのフラグに従ったSQL文を発行する というくらいです。。。 根本的に、マスタデータに対する更新/追加/削除のやり方が間違っていたりしますか? 誰も聞ける人がいないので、どうぞ宜しくお願いいたします!!!

専門家に質問してみよう