Skip to content

Commit 69ce39e

Browse files
authored
fix(BootstrapBlazorDataAnnotationsValidator): add IDispose interface (#6543)
* refactor: 移除扩展方法 * refactor: 增加 IDisposable 接口 * chore: bump version 9.9.1-beta04 * refactor: 精简代码
1 parent 1435764 commit 69ce39e

File tree

2 files changed

+85
-75
lines changed

2 files changed

+85
-75
lines changed

src/BootstrapBlazor/Components/ValidateForm/BootstrapBlazorDataAnnotationsValidator.cs

Lines changed: 85 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace BootstrapBlazor.Components;
1010
/// <summary>
1111
/// BootstrapBlazorDataAnnotationsValidator 验证组件
1212
/// </summary>
13-
public class BootstrapBlazorDataAnnotationsValidator : ComponentBase
13+
public class BootstrapBlazorDataAnnotationsValidator : ComponentBase, IDisposable
1414
{
1515
/// <summary>
1616
/// 获得/设置 当前编辑数据上下文
@@ -23,30 +23,110 @@ public class BootstrapBlazorDataAnnotationsValidator : ComponentBase
2323
/// 获得/设置 当前编辑窗体上下文
2424
/// </summary>
2525
[CascadingParameter]
26+
[NotNull]
2627
private ValidateForm? ValidateForm { get; set; }
2728

2829
[Inject]
2930
[NotNull]
3031
private IServiceProvider? Provider { get; set; }
3132

33+
[NotNull]
34+
private ValidationMessageStore? _message = null;
35+
3236
/// <summary>
3337
/// 初始化方法
3438
/// </summary>
3539
protected override void OnInitialized()
3640
{
3741
if (ValidateForm == null)
3842
{
39-
throw new InvalidOperationException($"{nameof(Components.BootstrapBlazorDataAnnotationsValidator)} requires a cascading " +
40-
$"parameter of type {nameof(Components.ValidateForm)}. For example, you can use {nameof(Components.BootstrapBlazorDataAnnotationsValidator)} " +
41-
$"inside an {nameof(Components.ValidateForm)}.");
43+
throw new InvalidOperationException($"{nameof(BootstrapBlazorDataAnnotationsValidator)} requires a cascading parameter of type {nameof(Components.ValidateForm)}. For example, you can use {nameof(BootstrapBlazorDataAnnotationsValidator)} inside an {nameof(Components.ValidateForm)}.");
4244
}
4345

44-
CurrentEditContext.AddEditContextDataAnnotationsValidation(ValidateForm, Provider);
46+
_message = new ValidationMessageStore(CurrentEditContext);
47+
AddEditContextDataAnnotationsValidation();
4548
}
4649

4750
/// <summary>
4851
/// 手动验证表单方法
4952
/// </summary>
5053
/// <returns></returns>
5154
internal bool Validate() => CurrentEditContext.Validate();
55+
56+
private void AddEditContextDataAnnotationsValidation()
57+
{
58+
CurrentEditContext.OnValidationRequested += OnValidationRequested;
59+
CurrentEditContext.OnFieldChanged += OnFieldChanged;
60+
}
61+
62+
private void RemoveEditContextDataAnnotationsValidation()
63+
{
64+
CurrentEditContext.OnValidationRequested -= OnValidationRequested;
65+
CurrentEditContext.OnFieldChanged -= OnFieldChanged;
66+
}
67+
68+
private void OnValidationRequested(object? sender, ValidationRequestedEventArgs args)
69+
{
70+
_ = ValidateModel(CurrentEditContext, _message, Provider);
71+
}
72+
73+
private void OnFieldChanged(object? sender, FieldChangedEventArgs args)
74+
{
75+
_ = ValidateField(CurrentEditContext, _message, args.FieldIdentifier, Provider);
76+
}
77+
78+
private async Task ValidateModel(EditContext editContext, ValidationMessageStore messages, IServiceProvider provider)
79+
{
80+
var validationContext = new ValidationContext(editContext.Model, provider, null);
81+
var validationResults = new List<ValidationResult>();
82+
await ValidateForm.ValidateObject(validationContext, validationResults);
83+
84+
messages.Clear();
85+
foreach (var validationResult in validationResults.Where(v => !string.IsNullOrEmpty(v.ErrorMessage)))
86+
{
87+
foreach (var memberName in validationResult.MemberNames)
88+
{
89+
if (!string.IsNullOrEmpty(memberName))
90+
{
91+
messages.Add(editContext.Field(memberName), validationResult.ErrorMessage!);
92+
}
93+
}
94+
}
95+
editContext.NotifyValidationStateChanged();
96+
}
97+
98+
private async Task ValidateField(EditContext editContext, ValidationMessageStore messages, FieldIdentifier field, IServiceProvider provider)
99+
{
100+
// 获取验证消息
101+
var validationResults = new List<ValidationResult>();
102+
var validationContext = new ValidationContext(field.Model, provider, null)
103+
{
104+
MemberName = field.FieldName,
105+
DisplayName = field.GetDisplayName()
106+
};
107+
108+
await ValidateForm.ValidateFieldAsync(validationContext, validationResults);
109+
110+
messages.Clear(field);
111+
messages.Add(field, validationResults.Where(v => !string.IsNullOrEmpty(v.ErrorMessage)).Select(result => result.ErrorMessage!));
112+
113+
editContext.NotifyValidationStateChanged();
114+
}
115+
116+
private void Dispose(bool disposing)
117+
{
118+
if (disposing)
119+
{
120+
RemoveEditContextDataAnnotationsValidation();
121+
}
122+
}
123+
124+
/// <summary>
125+
/// <inheritdoc/>
126+
/// </summary>
127+
public void Dispose()
128+
{
129+
Dispose(true);
130+
GC.SuppressFinalize(this);
131+
}
52132
}

src/BootstrapBlazor/Extensions/BootstrapBlazorEditContextDataAnnotationsExtensions.cs

Lines changed: 0 additions & 70 deletions
This file was deleted.

0 commit comments

Comments
 (0)