Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
コンソールでもモデル検証したい
Search
tomokusaba
June 01, 2023
Programming
0
180
コンソールでもモデル検証したい
コンソールでもモデル検証したい
.NET の 3 日間 (2 日目) ~3 コミュニティ合同イベント~
tomokusaba
June 01, 2023
Tweet
Share
More Decks by tomokusaba
See All by tomokusaba
Webアプリをできるだけコードを手書きしないで作ってみる
tomokusaba
1
24
Azure OpenAI Serviceのプロンプトエンジニアリング入門
tomokusaba
3
770
プロンプトエンジニアリング入門
tomokusaba
2
1.2k
Sementic Kernelのネイティブ関数について
tomokusaba
0
920
C#でのPlaywrightを使ったE2Eテストの実際
tomokusaba
0
380
「インフラ初心者」…からのPlaywright Testing
tomokusaba
1
330
Fluent UI Blazorの新しいComponentについて
tomokusaba
0
270
「インフラ初心者の私がAzure VMで.NETアプリをホストするまでサンタを帰さない」の続き!
tomokusaba
1
310
Sementic Kernelのネイティブ関数について
tomokusaba
0
270
Other Decks in Programming
See All in Programming
『Railsオワコン』と言われる時代に、なぜブルーモ証券はRailsを選ぶのか
free_world21
0
260
AWS CDKコントリビュートTIPS / aws-cdk-contribution-tips
gotok365
2
230
PHPの次期バージョンはこの時期どうなっているのか - Internalsの開発体制について - PHPカンファレンス小田原
youkidearitai
PRO
1
190
"config" ってなんだ? / What is "config"?
okashoi
0
240
1BRC--Nerd Sniping the Java Community
gunnarmorling
0
340
VS Code をプロダクトにどう取り込むか
onomax
1
430
PHP8.3の機能を振り返る / Review of PHP 8.3 features
seike460
PRO
1
110
大規模UIKitベースアプリへのTCAの段階的導入/gradual-adoption-of-tca-in-a-large-scale-uikit-based-app
takehilo
1
180
Fragment Composition of GraphQL
quramy
7
1k
Tailwind CSSを本気でカスタマイズする方法
fsubal
14
5.3k
#phpcon_odawara オープン・クローズドなテストフィクスチャを求めて / open closed test fixtures
77web
3
230
try!Swift Tokyo 2024 参加報告 LT
akidon0000
1
220
Featured
See All Featured
Principles of Awesome APIs and How to Build Them.
keavy
121
16k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
352
28k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
221
21k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
2
1.3k
It's Worth the Effort
3n
180
27k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
25
2.3k
Done Done
chrislema
178
15k
Being A Developer After 40
akosma
57
580k
A Modern Web Designer's Workflow
chriscoyier
689
190k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
79
43k
Fashionably flexible responsive web design (full day workshop)
malarkey
398
65k
Building Your Own Lightsaber
phodgson
99
5.7k
Transcript
コンソールでもモデル検証 したい 株式会社SAKURUG エンジニアリングユニット 草場 友光 .NET の 3 日間
(2 日目) ~3 コミュニティ合同イベント~
自己紹介 • 普段は主にシステムを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<ValidationResult> 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/Valid ateTest
.NET8 Preview2で追加 • .NET8 Preview2で組み込みのデータ検証に拡張属性がいくつ か追加されました。 属性 説明 Required(DisallowAllDefalutValues) 構造体がデフォルト値と等しくないことを検証
DateOnlyなら0001/01/01 Range(MinimumIsExclusive,MaximumIsE xclusive) 範囲の検証で境界値を拒否できるようになった (0,10)としたときは0と10はダメのように設定可能 ex) Length(10, 20) 文字列またはコレクションの長さの下限と上限を設定できるようになりました。 AllowedValues プロパティを検証するための許可リストを指定できる DeniedValues プロパティを検証するための拒否リストを指定できる
デモコード • https://github.com/tomokusaba/DataAnnotationsTestDo tnet8pre2
参考文献 • ASP.NET Core Blazor のフォームと入力コンポーネント
おしまい おしまい