Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Blazorにおける入力値検証について
Search
tomokusaba
March 11, 2023
Programming
1.9k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Blazorにおける入力値検証について
.NETラボ勉強会2023年3月
Blazorにおける入力値検証について
tomokusaba
March 11, 2023
More Decks by tomokusaba
See All by tomokusaba
30代後半からでも遅くないキャリア形成
tomokusaba
0
280
GitHub Copilotで書いたコード、レビューはどうしてる?
tomokusaba
0
54
Azure CAFで考えるAIエージェント導入の進め方
tomokusaba
1
110
GitHub Copilot app時代の開発フロー
tomokusaba
0
64
オートマトンと字句解析でRoslynを読む
tomokusaba
0
170
GitHub Copilot appとGitHub Copilot CLIとVS CodeのCopilot Chat Agent Modeの使い分け
tomokusaba
0
180
GitHub Copilot app最速の発信の裏側
tomokusaba
1
580
自宅サーバの変遷
tomokusaba
0
910
Microsoft Build Keynoteふりかえり
tomokusaba
0
180
Other Decks in Programming
See All in Programming
Building an Out-of-Order CPU
latte72
1
770
A2UI for Android: Safely Rendering AI-Generated UI with Jetpack Compose - DroidKaigi 2026
itsmedreamwalker
0
140
WebRTC映像をAirPlayに対応させる挑戦.pdf
monolithic_adam
0
240
巨大モノリシックアプリ モダン化大作戦
ktcryomm
0
1k
Webの地図
yosuke_furukawa
PRO
6
4.5k
cdk deploy JawsSonic #MARATHONしながらAWSリソースをデプロイしてみよう
akihisaikeda
2
130
Heart of Swift Concurrency
koher
0
720
選挙速報を多くのユーザーへ 届ける Live Activities 設計
hamayokokuririn
0
140
Security issues being discussed on Web Platforms
petamoriken
0
930
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
240
一人だけ、Kiroが静止する日
hideg
0
110
手動確認はもう限界 〜XCUITestでCustom URL Schemeの遷移を起動種別ごとに自動テストする〜 / Testing Custom URL Schemes with XCUITest
otouto
0
280
Featured
See All Featured
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
360
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
Statistics for Hackers
jakevdp
799
230k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
990
How to train your dragon (web standard)
notwaldorf
97
6.8k
Making the Leap to Tech Lead
cromwellryan
135
10k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.9k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
A better future with KSS
kneath
240
18k
Utilizing Notion as your number one productivity tool
mfonobong
4
590
The Pragmatic Product Professional
lauravandoore
37
7.4k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
690
Transcript
Blazorにおける入力値検証 について 株式会社SAKURUG エンジニアリングユニット 草場 友光 .NETラボ 2023年3月
自己紹介 • 普段は主にWebFormsアプリの保守の お仕事をしてます。 • 古めのシステムが多いので時代に取り 残されぬよう新しい技術を一つでも入 れるよう日々努力しています。 • 2022/08-2023
Microsoft MVP (Developer Technologies) • tomo_kusaba
宣伝 【VISION】ひとの可能性を開花させる企業であり続ける VISIONに共感できる仲間募集中。
注意 • 個人の見解・解釈が多分に入っています。 • 見解の相違・事実誤認などありましたらご指摘ください。 • #dotnetlabでtweetすると右側に表示されます
今日の目的 • Blazorでは組み込みの入力コンポーネント及びモデルに検証属 性をつけることで基本的な入力値検証が行えます。 • 従来のWebアプリケーションであれば入力値検証のロジックを クライアント側およびサーバ側で記述していましたがそれらが 不要になるので生産性が飛躍的に向上します。 • さらに、基本の入力値検証で不足する分はカスタム検証として
記述できます。これらの方法を本セッションでは紹介していき ます。 • 今回は、Blazor WebAssembly + ASP.NET Core WebAPIの プロジェクトです。
入力値検証の基本 • 一般的に入力値検証(バリデーション)はクライアント側、 サーバ側双方で行われることが一般的。 • クライアント側で入力値検証が行われることでユーザ利便性を 提供する。 • サーバ側で入力値検証が行われることでセキュリティを担保す る。
Blazor WebAssembly(クライアント側) • 入力値検証のためのフォーム(EditForm)が用意されている • DataAnnotationsValidatorによって検証属性に基づいて検証 を行うことができる。
組み込みの入力コンポーネント 入力コンポーネント 説明 InputCheckbox チェックボックス InputDate 日付入力 InputFile ファイルアップロード InputNumber
数値入力 InputRadio ラジオボタン InputSelect ドロップダウンリスト InputText テキストボックス InputTextArea テキストエリア
ASP.NET Core WebAPI • ApiController属性によりモデル検証エラーが発生すると HTTP400応答が自動的にトリガーされる。 • 必要な検証属性はクライアント側と共通 • 組み込みのデータ検証とカスタム検証ロジックの両方が検証さ
れる。
代表的な組み込みの検証属性 属性 説明 Required 入力がされているかどうかを検証します。 Range 入力が指定した範囲内であるかどうかを検証します。 StringLength 入力文字列が指定した長さを超えてないかどうかを検証しま す。
RegularExpression 入力が指定した正規表現と一致することを検証します。
モデル例
クライアント側検証エラー例 必須入力の名前を空欄とし た
サーバ側検証エラー例 名前を空欄とした
カスタム検証属性 • ValidationAttributeを継承してカスタム検証クラスを作成す る • IsValidメソッドをオーバーライドする
カスタム検証属性エラー例 未来日を入力
カスタム検証属性エラー例 未来日を入力
ここまでのまとめ • モデルに検証属性を記述することによりクライアント側もサー バ側も非常に簡単に入力検証を実施することが可能。 • 基本的な検証項目についてはコードの記述の必要はないのでと ても高効率。 • カスタム検証属性もクライアント側とサーバ側のコードを共通 とできるのでテストも1回で済む。
モデルが複合型になる場合 • 例えば、1-Nのデータ構造を持つ入力フォームが必要になる場 合
モデルが複合型になる場合 • 例えば、1-Nのデータ構造を持つ入力フォームが必要になる場 合
モデルが複合型になる場合の問題 よし、クライアント側でちゃんと検証 されてるぞ!! 送信ボタンを押してみる なぜか、サーバ側に送られて 400が返ってきた!
解決策(試験的) • 「 Microsoft.AspNetCore.Components.DataAnnotations.V alidation」をNuGet(プレリリース) • DataAnnotationsValidatorの代わりに ObjectGraphDataAnnotationsValidatorを使用する。 • ValidateComplexTypeでモデルのプロパティに注釈をつける
変更点(フォーム)
変更点(モデル)
無事 よし、クライアント側でちゃんと検証 されてるぞ!! 送信ボタンを押してみる サーバ送信されてない。 めでたし。
デモコード • https://github.com/tomokusaba/Dotn etLab202303Hosted • LocalDBを使用 • Visual Studioのパッケージマネージャコ ンソールで「update-database」
.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 のフォームと入力コンポーネント
おしまい おしまい