Start Debugging

.NET 11 Preview 5 で Blazor の静的 SSR フォームがクライアントサイド検証を獲得

サーバーで静的にレンダリングされる Blazor フォームは、完全な POST のラウンドトリップの後でしか検証できませんでした。.NET 11 Preview 5 は検証メタデータをレンダリングし、Blazor の JS が DataAnnotations のルールをブラウザーで適用します。circuit は不要です。

.NET 11 Preview 5 は 2026-06-09 にリリースされ、ASP.NET Core の 1 つの変更が、静的サーバーサイドレンダリング (static SSR) 上でフォームを構築する誰もが悩まされてきたギャップを埋めます。フォームがインタラクティブなレンダーモードなしでブラウザーで検証されるようになったのです。このプレビューまで、static SSR フォームがユーザーにメールアドレスの形式が正しくないと伝える方法はちょうど 1 つしかありませんでした。全体を送信し、サーバーに DataAnnotations を実行させ、エラーメッセージとともにページを再レンダリングするのです。タイプミス 1 つのために完全な POST のラウンドトリップが発生します。

なぜ static SSR フォームはサーバーに縛られていたのか

Blazor Web App テンプレートは、ほとんどのコンテンツを静的な HTML としてレンダリングします。SignalR の circuit も WebAssembly のペイロードもなく、まさにそれが static SSR が安価で高速な理由です。しかしクライアントサイド検証にはブラウザーで実行されるコードが必要で、静的なページはクライアントにコンポーネントのロジックを一切送信しません。そのため検証は完全にサーバー側に存在していました。フォームを送信し、DataAnnotationsValidator がモデルを走査し、いかなる失敗も再レンダリングされたページとして返ってきました。正しくはあるものの低速で、フォーカスを失ったときに誤ったフィールドをマークするインタラクティブなフォームと比べると貧弱な体験です。

よくある回避策は、ライブのフィードバックを得るためだけにフォームのコンポーネントを InteractiveServer または InteractiveWebAssembly に切り替え、本来は不要な circuit や WASM のダウンロードのコストを払うことでした。

Preview 5 はどのようにギャップを埋めるか

Preview 5 では、サーバーが検証ルールをメタデータとして HTML 内にレンダリングし、Blazor の JS がそれをブラウザーで適用します。あなたの DataAnnotations 属性は引き続き権威ある信頼できる情報源であり、送信時にサーバーで再び評価されます。ブラウザーは同じルールの早期かつ無償のコピーを受け取るだけです。この機能は DataAnnotationsValidator を含むすべての static SSR フォームに対してデフォルトで有効になっており、拡張フォームと非拡張フォームの両方で動作します。

学ぶべき新しい API はありません。すでに記述したフォームは、Preview 5 の SDK を対象にした瞬間からクライアントサイドで検証を始めます。

<EditForm Model="Model" Enhance FormName="registration" OnValidSubmit="HandleValidSubmit">
    <DataAnnotationsValidator />
    <div>
        <label for="Email">Email</label>
        <InputText @bind-Value="Model!.Email" id="Email" />
        <ValidationMessage For="@(() => Model!.Email)" />
    </div>
    <button type="submit" id="submit-btn">Register</button>
</EditForm>
public class RegistrationModel
{
    [Required]
    [EmailAddress]
    public string Email { get; set; }

    [Required]
    [StringLength(100, MinimumLength = 8)]
    public string Password { get; set; }

    [Required]
    [Compare("Password")]
    [Display(Name = "Confirm Password")]
    public string ConfirmPassword { get; set; }
}

誤ったメールアドレスや短すぎるパスワードは、フォームがネットワークに到達する前にブラウザーで表示されるようになりました。サーバーは POST 時に依然として同じチェックを実行するため、多層防御を失うことはありません。クライアント検証は利便性のレイヤーであってセキュリティ境界ではない、まさにあるべき姿です。

まだ欠けているもの

非同期ルール (データベースの一意性チェック、リモート API のルックアップ) はまだここには含まれていません。リリースノートによれば、完全な非同期のストーリーは、新しい非同期の DataAnnotations API が後のプレビューでリリースされるときに実現します。今のところこれは同期的な属性セットをカバーしており、それが現実のフォーム検証の大部分を占めます。

これは System.Text.Json の JSON Lines シリアル化 のような Preview 5 のその他の追加機能と組み合わさります。試すには、.NET 11 Preview 5 SDK をインストールし、net11.0 を対象にしてください。すべての詳細は ASP.NET Core Preview 5 リリースノート にあります。

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< 戻る