EditFormに基づくラッパーを組み立て、Fluent Validationを使用するだけです。このフォームに次の2つのプロパティを作成しました。
if (ModelValidation)
{
editContext.OnValidationRequested +=
(sender, eventArgs) => ValidateModel((EditContext)sender, messages);
}
if (FieldValidation)
{
editContext.OnFieldChanged +=
(sender, eventArgs) => ValidateField(editContext, messages, eventArgs.FieldIdentifier);
}
これにより、検証をOnFieldChanged(値の変更、終了フィールドで検証)または送信ボタンが押されたとき(OnValidationRequested)のいずれかで行うことができます。
ただし、空の(空ではないはずの)テキストフィールドのテキストフィールドを表示した場合、OnFieldChanged()ハンドラーは起動しません...(フィールドが変更されていないのは当然です)。 JavaScriptに頼らずにOnFieldChanged()またはkillフォーカスハンドラーを強制的に呼び出す方法はありますか?
これは面白いと思ったので、GitHubのASP .NET Coreプロジェクト)にあるBlazorのInputText
クラスのソースコードを見てみました。
https://github.com/dotnet/aspnetcore/blob/master/src/Components/Web/src/Forms/InputText.cs
イベントハンドラは1つしかなく、ユーザーがテキストボックスの値を変更したときにブラウザによって発生するonchange
イベント用であることがわかります。
builder.AddAttribute(4, "onchange", EventCallback.Factory.CreateBinder<string>(this, __value => CurrentValueAsString = __value, CurrentValueAsString));
サブスクライブするイベントはonblur
です。これは、ユーザーがフィールドをクリックしたり、フィールドを変更したかどうかに関係なくタブから移動したりしたときに発生します。
私はそれをInputTextまたはInputBase(InputTextの派生元)のどこにも見つけることができませんでしたが、これは機能しているように見えるため、どこかにあります。
@page "/"
<InputText @onblur="DoSomething" />
@code
{
private void DoSomething()
{ // Your logic here
}
}