Slide 1

Slide 1 text

コンソールでもモデル検証 したい 株式会社SAKURUG エンジニアリングユニット 草場 友光 .NET の 3 日間 (2 日目) ~3 コミュニティ合同イベント~

Slide 2

Slide 2 text

自己紹介 • 普段は主にシステムをAzureにモダナ イズする仕事をしています。 • コミュニティ活動を通じて知識をアッ プデートしています。 • 2022/08-2023 Microsoft MVP (Developer Technologies) • tomo_kusaba

Slide 3

Slide 3 text

宣伝 【VISION】ひとの可能性を開花させる企業であり続ける VISIONに共感できる仲間募集中。

Slide 4

Slide 4 text

注意 • 個人の見解・解釈が多分に入っています。 • 見解の相違・事実誤認などありましたらご指摘ください。

Slide 5

Slide 5 text

今日の目的 • ASP.NET Coreでは組み込みの入力コンポーネント及びモデル に検証属性をつけることで基本的な入力値検証が行えます。 • この検証属性をつけたモデルを利用しコンソールアプリケー ションでもモデル検証を行う方法について紹介します。

Slide 6

Slide 6 text

Webにおける入力値検証の基本 • 一般的に入力値検証(バリデーション)はクライアント側、 サーバ側双方で行われることが一般的。 • クライアント側で入力値検証が行われることでユーザ利便性を 提供する。 • サーバ側で入力値検証が行われることでセキュリティを担保す る。

Slide 7

Slide 7 text

Blazor WebAssembly(クライアント側) • 入力値検証のためのフォーム(EditForm)が用意されている • DataAnnotationsValidatorによって検証属性に基づいて検証 を行うことができる。

Slide 8

Slide 8 text

組み込みの入力コンポーネント 入力コンポーネント 説明 InputCheckbox チェックボックス InputDate 日付入力 InputFile ファイルアップロード InputNumber 数値入力 InputRadio ラジオボタン InputSelect ドロップダウンリスト InputText テキストボックス InputTextArea テキストエリア

Slide 9

Slide 9 text

ASP.NET Core WebAPI • ApiController属性によりモデル検証エラーが発生すると HTTP400応答が自動的にトリガーされる。 • 必要な検証属性はクライアント側と共通 • 組み込みのデータ検証とカスタム検証ロジックの両方が検証さ れる。

Slide 10

Slide 10 text

代表的な組み込みの検証属性 属性 説明 Required 入力がされているかどうかを検証します。 Range 入力が指定した範囲内であるかどうかを検証します。 StringLength 入力文字列が指定した長さを超えてないかどうかを検証しま す。 RegularExpression 入力が指定した正規表現と一致することを検証します。

Slide 11

Slide 11 text

モデル例

Slide 12

Slide 12 text

クライアント側検証エラー例 必須入力の名前を空欄とし た

Slide 13

Slide 13 text

サーバ側検証エラー例 名前を空欄とした

Slide 14

Slide 14 text

コンソールにおけるモデル検証 • System.ComponentModel.DataAnnotations. Validator.TryValidateObject()メソッドを使用する • 第一引数:モデル • 第二引数:ValidationContext • 第三引数:ValidationResultのList • 第四引数:すべてのプロパティをチェックするかどうか

Slide 15

Slide 15 text

コンソールにおけるモデル検証コード例 • 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); } }

Slide 16

Slide 16 text

デモ • モデル検証属性を確認 • モデル検証が成功するパターンについて確認 • モデル検証が失敗するパターンについて確認 • 必須属性 • 文字列長 • Email • エラーメッセージの表示の確認

Slide 17

Slide 17 text

まとめ • コンソールでもモデル検証は可能。 • コンソールでできるということはあらゆるアプリケーションモ デル・任意の場所でモデル検証が可能である。 • 例えば、Blazor WebAssemblyでは既定ではForm送信時のモ デル検証となっているがこの手法を使えばあらゆるタイミング での検証が可能(必要かどうかはさておき) • WebAPIではPOST/PUT時にモデル検証し失敗時に400応答す るのが既定動作であるが、これも任意タイミングで検証可能。 例えば、JSONファイルアップロード→オブジェクト化→モデ ル検証するなど

Slide 18

Slide 18 text

デモコード • https://github.com/tomokusaba/Valid ateTest

Slide 19

Slide 19 text

.NET8 Preview2で追加 • .NET8 Preview2で組み込みのデータ検証に拡張属性がいくつ か追加されました。 属性 説明 Required(DisallowAllDefalutValues) 構造体がデフォルト値と等しくないことを検証 DateOnlyなら0001/01/01 Range(MinimumIsExclusive,MaximumIsE xclusive) 範囲の検証で境界値を拒否できるようになった (0,10)としたときは0と10はダメのように設定可能 ex) Length(10, 20) 文字列またはコレクションの長さの下限と上限を設定できるようになりました。 AllowedValues プロパティを検証するための許可リストを指定できる DeniedValues プロパティを検証するための拒否リストを指定できる

Slide 20

Slide 20 text

デモコード • https://github.com/tomokusaba/DataAnnotationsTestDo tnet8pre2

Slide 21

Slide 21 text

参考文献 • ASP.NET Core Blazor のフォームと入力コンポーネント

Slide 22

Slide 22 text

おしまい おしまい