私は ASP.NET MVC フレームワークで遊んでいますが、私を本当に混乱させていることの 1 つは、投稿されたフォーム データのサーバー側の検証を行う方法です。同じ URL に返信しないと思いますが、そうでない場合、入力したデータとエラー メッセージを含むフォームを再表示するにはどうすればよいですか? また、検証ロジックはどこに行くべきですか? モデルまたはコントローラーで?これは、Web フォームがはるかに強力な数少ない領域の 1 つです (検証コントロールが恋しいです)。
6 に答える
MVC でのフローの概要を次に示します。
- /new - ユーザーが入力するフォームを含む「新規」ビューをレンダリングします
- ユーザーがフォームに入力すると、/create に投稿されます
- 投稿はコントローラーの作成アクションにルーティングされます
- アクション メソッドで、投稿されたデータでモデルを更新します。
- モデルはそれ自体を検証する必要があります。
- モデルが有効かどうかをコントローラーが読み取る必要があります。
- モデルが有効な場合は、データベースに保存します。/show にリダイレクトして、オブジェクトの表示ビューをレンダリングします。
- モデルが無効な場合は、フォームの値とエラー メッセージを TempData に保存し、再度 New アクションにリダイレクトします。フォーム フィールドに TempData からのデータを入力し、エラー メッセージを表示します。
検証フレームワークは、このプロセスに役立ちます。また、ASP.NET MVC チームは次のプレビュー用の検証フレームワークを計画していると思います。
ScottGu の ASP.Net prev 5 に関する最新の投稿をご覧になることをお勧めします。非常に興味深い検証サンプルが紹介されています。
私が知る限り、誰もが「標準的な」方法を見つけようとしています。そうは言っても、Phil Haack と Scott Guthrie の MVC に関する最新の投稿をぜひチェックしてください。自分で遊んでいたときに、生成した LinqToSql データ クラスの ModelBinder を作成しました。この投稿をチェックして、基本的な ModelBinder をまとめる方法を確認できます。
"Product" ModelBinder を作成した場合、アクションで次のようにアクションを宣言します。
public ActionResult New(製品 prod)
また、モデル バインダーは、投稿されたデータをオブジェクト プロパティに割り当てる処理を行います。
その後、 GetValue() メソッド内で、例外、正規表現、または次のような呼び出しを行うことができるものを使用するかどうかにかかわらず、必要な検証を実装できます。
(ModelStateDictionary_name).AddModelError("form_element_id", "entered_value", "error_message");
次に、ビューに <%= Html.ValidationSummary() %> をスローするだけで、すべてのエラーを表示できます。
クライアント側の検証には、jQuery を使用しました。基本的なサンプルのセットアップが完了したら、これらすべてを部分ビューと Ajax 呼び出しと組み合わせて、いくつかの興味深いことを始めることができます。
これをご覧になりましたか? http://www.codeplex.com/MvcValidatorToolkit
ページより引用
バリデーター ツールキットは、新しい ASP.NET MVC フレームワーク用の一連のバリデーターを提供し、検証セットを使用してクライアント側とサーバー側で HTML フォームを検証します。
私よりも MVC に詳しい人が、アーキテクチャのどこに物を置くべきかについて話さなければならないのではないかと心配しています。
Castle プロジェクトにはCastle.Components.Validatorモジュールがあります。とても機敏でパワフルです。モデル属性 (またはその他のソース) に基づいて検証ルールを生成し、jQuery、Prototype Validation、fValidate などを使用して JS 検証を生成することもできます。もちろん、バリデーターを IValidationEngine インターフェイスの背後で抽象化するのが賢明です。
私はMVCフレームワークも学んでいるので、これがどのようにずれているかはわかりませんが、私が理解していることから、Edit.aspxなどのビューにフォームがあります。次に、このフォームは、Edit.aspx でパラメーターとして設定したフォームの内容を渡す Update() などの別のアクション メソッドにコントローラーに投稿します。
Update(int id, string name, string foo)
そのメソッド内で検証を行うことができます。万事OKなら、
return View("Item", yourObject)