コンソールでもモデル検証したい .NET の 3 日間 (2 日目) ~3 コミュニティ合同イベント~
コンソールでもモデル検証したい株式会社SAKURUGエンジニアリングユニット草場 友光.NET の 3 日間 (2 日目) ~3 コミュニティ合同イベント~
View Slide
自己紹介• 普段は主にシステムをAzureにモダナイズする仕事をしています。• コミュニティ活動を通じて知識をアップデートしています。• 2022/08-2023 Microsoft MVP(Developer Technologies)• tomo_kusaba
宣伝【VISION】ひとの可能性を開花させる企業であり続けるVISIONに共感できる仲間募集中。
注意• 個人の見解・解釈が多分に入っています。• 見解の相違・事実誤認などありましたらご指摘ください。
今日の目的• ASP.NET Coreでは組み込みの入力コンポーネント及びモデルに検証属性をつけることで基本的な入力値検証が行えます。• この検証属性をつけたモデルを利用しコンソールアプリケーションでもモデル検証を行う方法について紹介します。
Webにおける入力値検証の基本• 一般的に入力値検証(バリデーション)はクライアント側、サーバ側双方で行われることが一般的。• クライアント側で入力値検証が行われることでユーザ利便性を提供する。• サーバ側で入力値検証が行われることでセキュリティを担保する。
Blazor WebAssembly(クライアント側)• 入力値検証のためのフォーム(EditForm)が用意されている• DataAnnotationsValidatorによって検証属性に基づいて検証を行うことができる。
組み込みの入力コンポーネント入力コンポーネント 説明InputCheckbox チェックボックスInputDate 日付入力InputFile ファイルアップロードInputNumber 数値入力InputRadio ラジオボタンInputSelect ドロップダウンリストInputText テキストボックスInputTextArea テキストエリア
ASP.NET Core WebAPI• ApiController属性によりモデル検証エラーが発生するとHTTP400応答が自動的にトリガーされる。• 必要な検証属性はクライアント側と共通• 組み込みのデータ検証とカスタム検証ロジックの両方が検証される。
代表的な組み込みの検証属性属性 説明Required 入力がされているかどうかを検証します。Range 入力が指定した範囲内であるかどうかを検証します。StringLength 入力文字列が指定した長さを超えてないかどうかを検証します。RegularExpression 入力が指定した正規表現と一致することを検証します。
モデル例
クライアント側検証エラー例必須入力の名前を空欄とした
サーバ側検証エラー例名前を空欄とした
コンソールにおけるモデル検証• System.ComponentModel.DataAnnotations.Validator.TryValidateObject()メソッドを使用する• 第一引数:モデル• 第二引数:ValidationContext• 第三引数:ValidationResultのList• 第四引数:すべてのプロパティをチェックするかどうか
コンソールにおけるモデル検証コード例• modelはモデル検証対象のオブジェクトList errors = new();bool isValid = Validator.TryValidateObject(model, new ValidationContext(model), errors, true);if (isValid){Console.WriteLine("Valid");}else{Console.WriteLine("Invalid");foreach (var error in errors){Console.WriteLine(error.ErrorMessage);}}
デモ• モデル検証属性を確認• モデル検証が成功するパターンについて確認• モデル検証が失敗するパターンについて確認• 必須属性• 文字列長• Email• エラーメッセージの表示の確認
まとめ• コンソールでもモデル検証は可能。• コンソールでできるということはあらゆるアプリケーションモデル・任意の場所でモデル検証が可能である。• 例えば、Blazor WebAssemblyでは既定ではForm送信時のモデル検証となっているがこの手法を使えばあらゆるタイミングでの検証が可能(必要かどうかはさておき)• WebAPIではPOST/PUT時にモデル検証し失敗時に400応答するのが既定動作であるが、これも任意タイミングで検証可能。例えば、JSONファイルアップロード→オブジェクト化→モデル検証するなど
デモコード• https://github.com/tomokusaba/ValidateTest
.NET8 Preview2で追加• .NET8 Preview2で組み込みのデータ検証に拡張属性がいくつか追加されました。属性 説明Required(DisallowAllDefalutValues) 構造体がデフォルト値と等しくないことを検証DateOnlyなら0001/01/01Range(MinimumIsExclusive,MaximumIsExclusive)範囲の検証で境界値を拒否できるようになった(0,10)としたときは0と10はダメのように設定可能ex) Length(10, 20) 文字列またはコレクションの長さの下限と上限を設定できるようになりました。AllowedValues プロパティを検証するための許可リストを指定できるDeniedValues プロパティを検証するための拒否リストを指定できる
デモコード• https://github.com/tomokusaba/DataAnnotationsTestDotnet8pre2
参考文献• ASP.NET Core Blazor のフォームと入力コンポーネント
おしまいおしまい