diff --git a/src/BootstrapBlazor/BootstrapBlazor.csproj b/src/BootstrapBlazor/BootstrapBlazor.csproj index db3526ac796..2eedb80c356 100644 --- a/src/BootstrapBlazor/BootstrapBlazor.csproj +++ b/src/BootstrapBlazor/BootstrapBlazor.csproj @@ -1,7 +1,7 @@ - 7.12.1-beta03 + 7.12.1-beta04 diff --git a/src/BootstrapBlazor/Components/ValidateForm/ValidateForm.razor.cs b/src/BootstrapBlazor/Components/ValidateForm/ValidateForm.razor.cs index f6ca339332a..6ef2d324d74 100644 --- a/src/BootstrapBlazor/Components/ValidateForm/ValidateForm.razor.cs +++ b/src/BootstrapBlazor/Components/ValidateForm/ValidateForm.razor.cs @@ -435,8 +435,10 @@ private async Task ValidateAsync(IValidateComponent validator, ValidationContext ValidateDataAnnotations(propertyValue, context, messages, pi); if (messages.Count == 0) { + _tcs = new(); // 自定义验证组件 await validator.ValidatePropertyAsync(propertyValue, context, messages); + _tcs.SetResult(!messages.Any()); } } @@ -456,6 +458,8 @@ internal void RegisterAsyncSubmitButton(ButtonBase button) AsyncSubmitButtons.Add(button); } + private TaskCompletionSource? _tcs; + private async Task OnValidSubmitForm(EditContext context) { var isAsync = AsyncSubmitButtons.Any(); @@ -467,10 +471,28 @@ private async Task OnValidSubmitForm(EditContext context) { await Task.Yield(); } - if (OnValidSubmit != null) + + var valid = true; + // 由于可能有异步验证,需要等待异步验证结束 + if (_tcs != null) { - await OnValidSubmit(context); + valid = await _tcs.Task; } + if (valid) + { + if (OnValidSubmit != null) + { + await OnValidSubmit(context); + } + } + else + { + if (OnInvalidSubmit != null) + { + await OnInvalidSubmit(context); + } + } + foreach (var b in AsyncSubmitButtons) { b.TriggerAsync(false); @@ -520,7 +542,7 @@ public bool Validate() /// public void NotifyFieldChanged(in FieldIdentifier fieldIdentifier, object? value) { - ValueChagnedFields.AddOrUpdate(fieldIdentifier, key => value, (key, v) => value); + ValueChangedFields.AddOrUpdate(fieldIdentifier, key => value, (key, v) => value); OnFieldValueChanged?.Invoke(fieldIdentifier.FieldName, value); } @@ -528,5 +550,13 @@ public void NotifyFieldChanged(in FieldIdentifier fieldIdentifier, object? value /// 获取 当前表单值改变的属性集合 /// /// + public ConcurrentDictionary ValueChangedFields { get; } = new(); + + /// + /// 获取 当前表单值改变的属性集合 + /// + /// + [Obsolete("已过期,单词拼写错误,请使用 ValueChangedFields,Please use ValueChangedFields instead. wrong typo")] + [ExcludeFromCodeCoverage] public ConcurrentDictionary ValueChagnedFields { get; } = new(); } diff --git a/test/UnitTest/Validators/ValidatorAsyncTest.cs b/test/UnitTest/Validators/ValidatorAsyncTest.cs index 64df9de4ec9..e9fa5bc5f97 100644 --- a/test/UnitTest/Validators/ValidatorAsyncTest.cs +++ b/test/UnitTest/Validators/ValidatorAsyncTest.cs @@ -12,20 +12,33 @@ public class ValidatorAsyncTest : BootstrapBlazorTestBase [Fact] public async Task Validate_Ok() { + var invalid = false; var foo = new Foo() { Name = "Test" }; var cut = Context.RenderComponent(pb => { pb.Add(a => a.Model, foo); + pb.Add(a => a.OnInvalidSubmit, context => + { + invalid = true; + return Task.CompletedTask; + }); pb.AddChildContent>(pb => { pb.Add(a => a.Value, foo.Name); pb.Add(a => a.ValueExpression, foo.GenerateValueExpression()); pb.Add(a => a.ValidateRules, new List { new MockValidator() }); }); + pb.AddChildContent