注
これは、この記事の最新バージョンではありません。 現在のリリースについては、この記事の .NET 10 バージョンを参照してください。
警告
このバージョンの ASP.NET Coreはサポートされなくなりました。 詳細については、.NETおよびコア サポート ポリシー.NETを参照してください。 現在のリリースについては、この記事の .NET 10 バージョンを参照してください。
この記事では、 Blazor フォームでユーザー入力を検証する方法について説明します。
ほとんどのフォームでは、最も簡単で推奨される方法は、データ注釈検証属性をモデルに追加し、EditFormにDataAnnotationsValidator コンポーネントを配置することです。 Blazor また、フォームコンポーネントまたは再利用可能なバリデーターコンポーネントで、フォームの EditContextを介したカスタム検証もサポートしています。
関連記事では、次の詳細が提供されます。
- カスタムルール、非同期ルール、入れ子になったオブジェクト検証、ローカライズなど、モデルベースの検証ルールの記述と構成については、ASP.NET Coreの検証を参照してください。
- 静的サーバー側レンダリング (静的 SSR) でのライブ ブラウザー検証については、静的 SSR のクライアント側フォーム検証 ASP.NET Core Blazor参照してください。
- 検証コンポーネントとリモート検証の完全な実装については、高度なフォーム検証 ASP.NET Core Blazor参照してください。
- モデルベースの検証規則と入れ子になったオブジェクトの検証の記述と構成については、ASP.NET Coreの検証を参照してください。
- 検証コンポーネントとリモート検証の完全な実装については、高度なフォーム検証 ASP.NET Core Blazor参照してください。
- 検証コンポーネントとリモート検証の完全な実装については、高度なフォーム検証 ASP.NET Core Blazor参照してください。
データ注釈を使用して検証する
次のモデルでは、 RequiredAttribute と RangeAttributeを使用します。
Starship.cs:
using System.ComponentModel.DataAnnotations;
public class Starship
{
[Required]
public string? Identifier { get; set; }
[Range(1, 10, ErrorMessage = "Accommodation must be between 1 and 10.")]
public int MaximumAccommodation { get; set; }
}
モデルを EditFormに追加し、 DataAnnotationsValidatorを含め、 ValidationMessage<TValue> または ValidationSummaryでエラーを表示します。
OnValidSubmit コールバックは、検証が成功した場合にのみ呼び出されます。
<EditForm Model="Model" OnValidSubmit="Submit">
<DataAnnotationsValidator />
<ValidationSummary />
<p>
<label>
Identifier:
<InputText @bind-Value="Model.Identifier" />
</label>
<ValidationMessage For="() => Model.Identifier" />
</p>
<p>
<label>
Maximum accommodation:
<InputNumber @bind-Value="Model.MaximumAccommodation" />
</label>
<ValidationMessage For="() => Model.MaximumAccommodation" />
</p>
<button type="submit">Submit</button>
</EditForm>
@code {
private Starship Model { get; } = new Starship();
private void Submit()
{
// Process the valid form.
}
}
静的 SSR フォームポストの場合は、一意の FormName を割り当て、 [SupplyParameterFromForm]でポストされたモデルを受け取ります。
<EditForm Model="Model" FormName="starship" OnValidSubmit="Submit">
...
</EditForm>
@code {
[SupplyParameterFromForm]
private Starship? Model { get; set; }
protected override void OnInitialized() => Model ??= new();
}
フォームの送信とレンダリング モード間でのモデル バインディングの詳細については、BlazorおよびASP.NET Core フォームのバインディングを参照してください。
DataAnnotationsValidator コンポーネントがない場合、モデルの検証属性はフォームの検証に参加しません。
検証の実行時
Blazor は、フィールドの検証と完全なフォームの検証を実行します。
- フィールドの検証は、フィールドが変更された後に実行されます。 対話型フォームでは、ユーザーがフォームを編集するときに.NETで発生します。
- フルフォーム検証は通常、
OnValidSubmitがOnInvalidSubmitまたはEditFormを介して送信を処理するときに実行されます。OnSubmitハンドラーは、コントロール フォームの送信に関するページで説明されているように、検証を制御します。
静的 SSR フォームでは、静的 SSR での ASP.NET Core のクライアント側フォーム検証Blazorにより、ブラウザーからのライブ フィードバックを提供できます。 フォームは、投稿時にサーバー上で再び権限を持って検証されます。
静的 SSR フォームは、投稿時にサーバー上で検証され、要求間のライブ フィールド検証は提供されません。
メンバーを識別する検証結果は、そのフィールドに関連付けられます。 メンバー名のない結果はモデルに関連付けられ、フィールドの ValidationMessage コンポーネントではなく検証の概要に表示されます。
データ注釈の検証を構成する
DataAnnotationsValidator では、フォームの DataAnnotations 検証が常に有効になります。
Microsoft.Extensions.Validation パッケージによって提供される拡張検証機能を使用するには、Program ファイルでAddValidation拡張メソッドを呼び出します。
builder.Services.AddValidation();
AddValidation呼び出しは、パッケージの検証サービスを登録し、検出されたモデルの種類の検証メタデータを作成するソース ジェネレーターをアクティブにします。 使用可能な動作は、そのメタデータにフォームのモデルが含まれているかどうかによって異なります。
| コンフィギュレーション | Behavior |
|---|---|
| 生成されたメタデータを使用できる | 入れ子になったオブジェクトとコレクションを検証し、メッセージのローカライズをサポートします。 |
| 生成されたメタデータは使用できません | 最上位のプロパティを検証しますが、入れ子になったオブジェクトやコレクションは検証せず、メッセージローカライズ パイプライン Microsoft.Extensions.Validation 使用しません。 |
| コンフィギュレーション | Behavior |
|---|---|
| 生成されたメタデータを使用できる | 入れ子になったオブジェクトとコレクションを検証します。 |
| 生成されたメタデータは使用できません | 最上位レベルのプロパティのみを検証します。 |
ValidatableTypeAttribute API とSkipValidationAttribute API は、.NET 10 で試験段階にあります。 詳細と使用可能な回避策については、ASP.NET Coreでの検証に関するページを参照してください。
Microsoft.Extensions.Validation を使用する場合は、Razor コンポーネント ファイル (.cs) ではなく、C# ファイル (.razor) でモデル型を宣言します。 ソース ジェネレーターは C# ソースから検証メタデータを作成し、 Razor コンポーネントで宣言されたモデル型を含めることはできません。
構成要件、検証順序、カスタム ルール、入れ子になったオブジェクト グラフ、生成されたメタデータについては、ASP.NET Coreの検証を参照してください。
入れ子になったオブジェクト グラフを検証する
.NET 9 以前では、DataAnnotationsValidatorは最上位レベルのモデル プロパティを検証しますが、コレクションプロパティや複合型プロパティは再帰的に検証しません。 再帰的検証の場合は、試験的なMicrosoft.AspNetCore.Components.DataAnnotations.ValidationパッケージのObjectGraphDataAnnotationsValidatorと[ValidateComplexType]を使用します。
<EditForm Model="Model" OnValidSubmit="Submit">
<ObjectGraphDataAnnotationsValidator />
...
</EditForm>
public class Starship
{
[ValidateComplexType]
public ShipDescription Description { get; set; } =
new ShipDescription();
}
パッケージは、これらのフレームワーク バージョンでは試験段階のままです。
[CompareProperty] 属性
.NET 5 以前の場合は、CompareAttributeではなく実験用パッケージのComparePropertyAttributeを使用します。
ComparePropertyAttribute は、フィールドと完全なフォームの検証中に一貫して検証結果をフィールドに関連付けます。
モデル ベースのカスタム 規則を記述する
組み込み属性でルールを表現できない場合は、カスタム ValidationAttribute または IValidatableObjectを使用します。 詳細なガイダンスについては、ASP.NET Coreでの検証を参照してください。
モデル ベースのカスタム 規則を記述する
組み込み属性でルールを表現できない場合は、 カスタム検証属性 を使用するか、 IValidatableObjectを実装します。 どちらもDataAnnotationsValidatorを介して行われます。
カスタム属性から ValidationResult を返す場合は、検証済みのメンバー名を含めると、そのフィールドの ValidationMessage コンポーネントに結果が表示されます。
カスタム属性は、 GetServiceを介して登録済みサービスを解決できます。
EditContext を通じて検証を追加する
EditFormでは、Model パラメーターが割り当てられると、EditContextが自動的に作成されます。 検証 API を直接使用するには、コンテキストを自分で作成し、EditFormの EditContext パラメーターに割り当てます。
ModelとEditContextの両方を同じフォームに割り当てないでください。
カスタム検証では、一般的に次の機能が使用されます。
- OnValidationRequested フルフォーム検証用。
- OnFieldChanged フィールド検証用です。
- ValidationMessageStore をクリックして、メッセージを追加およびクリアします。
- NotifyValidationStateChanged メッセージの変更後に UI に通知します。
次の対話型フォーム パターンは、データ注釈の検証と共にフォーム レベルのビジネス ルールを追加し、関連するフィールドが変更されたときにルールを再確認します。
@implements IDisposable
<EditForm EditContext="editContext" OnValidSubmit="Submit">
<DataAnnotationsValidator />
<ValidationSummary />
...
</EditForm>
@code {
private Starship Model { get; } = new Starship();
private EditContext editContext = default!;
private ValidationMessageStore messages = default!;
protected override void OnInitialized()
{
editContext = new EditContext(Model);
messages = new ValidationMessageStore(editContext);
editContext.OnValidationRequested += ValidateBusinessRules;
editContext.OnFieldChanged += ValidateChangedField;
}
private void ValidateBusinessRules(
object? sender, ValidationRequestedEventArgs e)
{
messages.Clear();
ValidateIdentifier();
editContext.NotifyValidationStateChanged();
}
private void ValidateChangedField(
object? sender, FieldChangedEventArgs e)
{
if (e.FieldIdentifier.FieldName != nameof(Starship.Identifier) &&
e.FieldIdentifier.FieldName != nameof(Starship.MaximumAccommodation))
{
return;
}
messages.Clear(
editContext.Field(nameof(Starship.Identifier)));
ValidateIdentifier();
editContext.NotifyValidationStateChanged();
}
private void ValidateIdentifier()
{
if (Model.MaximumAccommodation == 1 &&
string.IsNullOrWhiteSpace(Model.Identifier))
{
messages.Add(
editContext.Field(nameof(Starship.Identifier)),
"An identifier is required for a single-occupant ship.");
}
}
private void Submit()
{
// Process the valid form.
}
public void Dispose()
{
editContext.OnValidationRequested -= ValidateBusinessRules;
editContext.OnFieldChanged -= ValidateChangedField;
}
}
OnFieldChanged ハンドラーは、e.FieldIdentifierで変更されたフィールドを受け取ります。 前の例に示すように、影響を受けるメッセージをクリアまたは置換し、 NotifyValidationStateChangedを呼び出します。
静的 SSR では、要求間のライブ .NET フィールド検証は提供されません。
非同期のフル フォーム検証の場合は、OnValidationRequested ハンドラーからe.AddAsyncValidatorを呼び出します。 対話型フォームでの非同期フィールド検証の場合は、OnFieldChanged ハンドラーからEditContext.RegisterAsyncFieldValidatorを呼び出します。 同じフィールドに対する新しい非同期検証は、前のフィールドよりも優先され、取り消されます。
モデルベースの非同期検証属性については、「ASP.NET Coreの検証」を参照してください。 完全な再利用可能な検証コンポーネントについては、高度なフォーム検証 ASP.NET Core Blazor参照してください。
イベント サブスクリプションとそのメッセージ ストアをカプセル化する再利用可能な実装については、フォームの高度な検証 ASP.NET Core Blazor参照してください。
検証メッセージを表示する
ValidationMessage<TValue>を使用して、1 つのフィールドに関連付けられているメッセージを表示します。
<ValidationMessage For="() => Model.Identifier" />
For式は、モデル インスタンスとプロパティによってフィールドを識別します。
Blazor は、 FieldIdentifierを持つこの ID を表すので、異なるモデル インスタンスで同じ名前のプロパティは異なるフィールドとして扱われます。 文字列の代わりに式を使用すると、リファクタリング ツールでプロパティ参照を更新することもできます。
ValidationSummaryを使用して、フォームのメッセージを表示します。
<ValidationSummary />
概要の Model パラメーターを割り当てて、特定のモデルに関連付けられているメッセージに制限します。
<ValidationSummary Model="Model" />
コード内の現在のメッセージを検査するには、 GetValidationMessagesを呼び出します。
var allMessages = editContext.GetValidationMessages();
var fieldMessages = editContext.GetValidationMessages(
editContext.Field(nameof(Starship.Identifier)));
これらのメソッドは、現在の検証状態を読み取ります。 検証は開始されません。
検証の外観をカスタマイズする
Blazor は、フィールドとメッセージの状態を表す CSS クラスを適用します。
| 要素 | クラス |
|---|---|
| 入力 |
validまたはinvalid、ユーザーがフィールドを編集した後にmodified |
| 検証メッセージ | validation-message |
| 検証の概要 |
validation-summary-errors または validation-summary-valid |
非同期フィールド検証を使用する入力では、対応する状態が適用されている間、validまたはinvalidではなく、pendingまたはfaulted (必要に応じてmodifiedを使用) が使用されます。
Blazor プロジェクト テンプレートには、一般的な有効なクラスと無効なクラスのスタイルが含まれています。 必要に応じて、他のクラスのスタイルを追加します。
ValidationMessage また、 ValidationSummary は任意の HTML 属性も受け入れます。
class属性を指定すると、コンポーネントの既定のクラスが置き換えられます。
入力コンポーネントに適用されるクラスを変更するには、 FieldCssClassProviderから派生します。
using Microsoft.AspNetCore.Components.Forms;
public sealed class BootstrapFieldCssClassProvider : FieldCssClassProvider
{
public override string GetFieldCssClass(
EditContext editContext,
in FieldIdentifier fieldIdentifier)
{
if (!editContext.IsModified(fieldIdentifier))
{
return string.Empty;
}
return editContext.IsValid(fieldIdentifier)
? "is-valid"
: "is-invalid";
}
}
using System.Linq;
using Microsoft.AspNetCore.Components.Forms;
public sealed class BootstrapFieldCssClassProvider : FieldCssClassProvider
{
public override string GetFieldCssClass(
EditContext editContext,
in FieldIdentifier fieldIdentifier)
{
if (!editContext.IsModified(fieldIdentifier))
{
return string.Empty;
}
return editContext.GetValidationMessages(fieldIdentifier).Any()
? "is-invalid"
: "is-valid";
}
}
カスタム FieldCssClassProvider は、各フィールドの完全なクラス値を決定します。 フォームで非同期フィールド検証を使用する場合は、保留中または障害が発生したクラスが必要な場合に、プロバイダーで IsValidationPending(fieldIdentifier) と IsValidationFaulted(fieldIdentifier) を処理します。
フォームの EditContextにプロバイダーを割り当てます。
editContext.SetFieldCssClassProvider(
new BootstrapFieldCssClassProvider());
カスタム入力マークアップの場合は、 FieldCssClass を呼び出して、現在のプロバイダーによって選択されたクラスを取得します。
EditFormにモデルが割り当てられると、その子コンテンツは生成されたEditContextを受け取ります。
Context パラメーターを使用してコンテキストをキャプチャし、FieldCssClassを呼び出して、フィールドのクラスを周囲のマークアップに適用します。
<EditForm Model="Model" Context="editContext">
<DataAnnotationsValidator />
<div class="@editContext.FieldCssClass(
() => Model.Identifier)">
<InputText @bind-Value="Model.Identifier" />
<ValidationMessage For="() => Model.Identifier" />
</div>
</EditForm>
検証状態に応答する
EditContext は、検証を開始せずに現在の検証状態を公開します。
-
IsModified(field)またはIsModified()を使用して、特定のフィールドまたはフォーム内のいずれかのフィールドが変更されたかどうかを判定します。 -
GetValidationMessages(field)またはGetValidationMessages()を使用して、現在のフィールドまたはフォーム メッセージを検査します。
IsValid(field)を使用して、フィールドに現在検証メッセージがあるかどうかを判断します。
フィールドの場合、メッセージがないかどうかを !editContext.GetValidationMessages(field).Any()で確認できます。
次の例では、フィールドが変更され、無効な場合にのみ、カスタム UI を表示します。
@{
var identifier = editContext.Field(nameof(Starship.Identifier));
}
@if (editContext.IsModified(identifier) &&
!editContext.IsValid(identifier))
{
<p>Correct the identifier before continuing.</p>
}
@{
var identifier = editContext.Field(nameof(Starship.Identifier));
}
@if (editContext.IsModified(identifier) &&
editContext.GetValidationMessages(identifier).Any())
{
<p>Correct the identifier before continuing.</p>
}
入力コンポーネント、 ValidationMessage、および ValidationSummary は、検証状態が変化したときにそれ自体を更新します。 他の条件付き検証 UI をレンダリングするコンポーネントは、 OnValidationStateChanged をサブスクライブし、 StateHasChangedを呼び出す必要があります。
private void HandleValidationStateChanged(
object? sender, ValidationStateChangedEventArgs e) =>
_ = InvokeAsync(StateHasChanged);
コンポーネントが破棄されたときに、 OnValidationStateChanged の登録を解除します。
非同期フィールドの検証には、 IsValidationPending(field) と IsValidationFaulted(field) を使用します。 パラメーターなしのメソッドは、フォーム レベルの ValidateAsync パスを記述し、すべてのフィールドの状態を集計するわけではありません。
これらの状態には、 DataAnnotationsValidatorによって実行される非同期作業も含まれます。 プロパティに適用される AsyncValidationAttribute は、既定の pending や faulted CSS クラスなど、フィールドの検証中にフィールドの状態を使用します。
ValidateAsync中、非同期属性とIAsyncValidatableObjectは、パラメーターなしのメソッドによって報告されるフォーム レベルの状態に影響します。
ライブ保留インジケーターには、対話型レンダリング モードが必要です。 静的 SSR フォームの投稿中に、応答がレンダリングされる前にサーバー側の検証が完了します。
フォームの送信を制御する
EditForm には、次の 3 つの送信コールバックが用意されています。
| コールバック | Behavior |
|---|---|
| OnValidSubmit | 自動検証が成功した後に実行されます。 |
| OnInvalidSubmit | 自動検証が失敗した後に実行されます。 |
| OnSubmit | ハンドラーに検証と送信の制御を提供します。 |
OnValidSubmit と OnInvalidSubmit を一緒に使用できます。
OnSubmitを両方とも組み合わせないでください。
EditFormは、OnValidSubmitまたはOnInvalidSubmitを呼び出す前にValidateAsyncを使用するため、同期検証コントロールと非同期検証コントロールを待機します。
OnSubmitを処理する場合は、フォームを処理する前にValidateAsyncを呼び出します。
<EditForm EditContext="editContext" OnSubmit="HandleSubmit">
...
</EditForm>
@code {
private async Task HandleSubmit(EditContext editContext)
{
if (await editContext.ValidateAsync())
{
await SaveAsync();
}
}
}
同期Validateメソッドは、.NET 11 では使用されていません。 非同期検証は待機せず、ハンドラーが非同期作業を登録しようとするとスローされます。
対話型フォームの場合、フォーム レベルの保留中の状態を使用して、 ValidateAsync の実行中に送信を無効にすることができます。
<button type="submit" disabled="@editContext.IsValidationPending()">
Save
</button>
OnSubmitを処理する場合は、フォームを処理する前にValidateを呼び出します。
<EditForm EditContext="editContext" OnSubmit="HandleSubmit">
...
</EditForm>
@code {
private void HandleSubmit(EditContext editContext)
{
if (editContext.Validate())
{
Save();
}
}
}
関連するコンテンツ
ASP.NET Core