diff --git a/src/BootstrapBlazor/Components/Checkbox/CheckboxList.razor.cs b/src/BootstrapBlazor/Components/Checkbox/CheckboxList.razor.cs
index b71aa269c8fba9854fb3efe03c0a57cbccaab75e..b906e9775dc2c87a773fe4839d08c9333e2b1a27 100644
--- a/src/BootstrapBlazor/Components/Checkbox/CheckboxList.razor.cs
+++ b/src/BootstrapBlazor/Components/Checkbox/CheckboxList.razor.cs
@@ -20,7 +20,7 @@ namespace BootstrapBlazor.Components
///
/// CheckboxList 组件基类
///
- public sealed partial class CheckboxList
+ public partial class CheckboxList
{
///
/// 获得 组件样式
diff --git a/src/BootstrapBlazor/Components/ValidateForm/ValidateForm.razor.cs b/src/BootstrapBlazor/Components/ValidateForm/ValidateForm.razor.cs
index f9066dda4803ed7c1d7a7c5d061b035290aa9b15..cef5a08c2c576adc46cdbf46f69cf4e4104d4778 100644
--- a/src/BootstrapBlazor/Components/ValidateForm/ValidateForm.razor.cs
+++ b/src/BootstrapBlazor/Components/ValidateForm/ValidateForm.razor.cs
@@ -186,36 +186,19 @@ namespace BootstrapBlazor.Components
if (!validator.IsDisabled && !validator.SkipValidate)
{
var messages = new List();
- var propertyValidateContext = new ValidationContext(key.Model)
- {
- MemberName = key.FieldName,
- DisplayName = key.GetDisplayName()
- };
var pi = key.Model.GetType().GetProperties().Where(p => p.Name == key.FieldName).FirstOrDefault();
if (pi != null)
{
- // 单独处理 Upload 组件
- if (validator is IUpload uploader)
+ var propertyValidateContext = new ValidationContext(key.Model)
{
- // 处理多个上传文件
- uploader.UploadFiles.ForEach(file =>
- {
- ValidateDataAnnotations(file.File, propertyValidateContext, messages, pi, file.ValidateId);
- });
- }
- else
- {
- // 设置其关联属性字段
- var propertyValue = LambdaExtensions.GetPropertyValue(key.Model, key.FieldName);
+ MemberName = key.FieldName,
+ DisplayName = key.GetDisplayName()
+ };
- ValidateDataAnnotations(propertyValue, propertyValidateContext, messages, pi);
+ // 设置其关联属性字段
+ var propertyValue = LambdaExtensions.GetPropertyValue(key.Model, key.FieldName);
- if (messages.Count == 0)
- {
- // 自定义验证组件
- validator.ValidateProperty(propertyValue, propertyValidateContext, messages);
- }
- }
+ Validate(validator, propertyValidateContext, messages, pi, propertyValue);
}
// 客户端提示
validator.ToggleMessage(messages, false);
@@ -239,28 +222,8 @@ namespace BootstrapBlazor.Components
var pi = fieldIdentifier.Model.GetType().GetProperties().Where(p => p.Name == fieldName).FirstOrDefault();
if (pi != null)
{
- // 单独处理 Upload 组件
- if (validator is IUpload uploader)
- {
- // 处理多个上传文件
- uploader.UploadFiles.ForEach(file =>
- {
- ValidateDataAnnotations(file.File, context, results, pi, file.ValidateId);
- });
- }
- else
- {
- var propertyValue = LambdaExtensions.GetPropertyValue(fieldIdentifier.Model, fieldIdentifier.FieldName);
-
- // 验证 DataAnnotations
- ValidateDataAnnotations(propertyValue, context, results, pi);
-
- if (results.Count == 0)
- {
- // 自定义验证组件
- validator.ValidateProperty(propertyValue, context, results);
- }
- }
+ var propertyValue = LambdaExtensions.GetPropertyValue(fieldIdentifier.Model, fieldIdentifier.FieldName);
+ Validate(validator, context, results, pi, propertyValue);
}
// 客户端提示
@@ -278,7 +241,7 @@ namespace BootstrapBlazor.Components
///
private void ValidateDataAnnotations(object? value, ValidationContext context, ICollection results, PropertyInfo propertyInfo, string? memberName = null)
{
- var rules = propertyInfo.GetCustomAttributes(true).Where(i => i.GetType().IsSubclassOf(typeof(ValidationAttribute))).Cast();
+ var rules = propertyInfo.GetCustomAttributes(true).OfType();
var displayName = context.DisplayName;
memberName ??= propertyInfo.Name;
var attributeSpan = "Attribute".AsSpan();
@@ -335,19 +298,20 @@ namespace BootstrapBlazor.Components
///
private void ValidateProperty(ValidationContext context, List results)
{
- var properties = context.ObjectType.GetRuntimeProperties().Where(p => IsPublic(p) && !p.GetIndexParameters().Any());
+ // 获得所有可写属性
+ var properties = context.ObjectType.GetRuntimeProperties()
+ .Where(p => IsPublic(p) && p.CanWrite && !p.GetIndexParameters().Any());
foreach (var pi in properties)
{
// 设置其关联属性字段
var propertyValue = LambdaExtensions.GetPropertyValue(context.ObjectInstance, pi.Name);
- // 检查当前值是否为 Class
- if (propertyValue != null && propertyValue is not string && propertyValue.GetType().IsClass)
+ // 检查当前值是否为 Class 不是 string 不是集合
+ if (propertyValue != null && propertyValue is not string
+ && !propertyValue.GetType().IsAssignableTo(typeof(System.Collections.IEnumerable))
+ && propertyValue.GetType().IsClass)
{
- var fieldContext = new ValidationContext(propertyValue)
- {
- MemberName = pi.Name
- };
+ var fieldContext = new ValidationContext(propertyValue);
ValidateProperty(fieldContext, results);
}
else
@@ -356,27 +320,13 @@ namespace BootstrapBlazor.Components
var messages = new List();
var fieldIdentifier = new FieldIdentifier(context.ObjectInstance, pi.Name);
context.DisplayName = fieldIdentifier.GetDisplayName();
+ context.MemberName = fieldIdentifier.FieldName;
if (ValidatorCache.TryGetValue(fieldIdentifier, out var validator) && !validator.IsDisabled && !validator.SkipValidate)
{
- // 单独处理 Upload 组件
- if (validator is IUpload uploader)
- {
- // 处理多个上传文件
- uploader.UploadFiles.ForEach(file =>
- {
- ValidateDataAnnotations(file.File, context, messages, pi, file.ValidateId);
- });
- }
- else
- {
- ValidateDataAnnotations(propertyValue, context, messages, pi);
- if (messages.Count == 0)
- {
- // 自定义验证组件
- validator.ValidateProperty(propertyValue, context, messages);
- }
- }
+ // 组件进行验证
+ Validate(validator, context, messages, pi, propertyValue);
+
// 客户端提示
validator.ToggleMessage(messages, true);
}
@@ -385,6 +335,28 @@ namespace BootstrapBlazor.Components
}
}
+ private void Validate(IValidateComponent validator, ValidationContext context, List messages, PropertyInfo pi, object? propertyValue)
+ {
+ // 单独处理 Upload 组件
+ if (validator is IUpload uploader)
+ {
+ // 处理多个上传文件
+ uploader.UploadFiles.ForEach(file =>
+ {
+ ValidateDataAnnotations(file.File, context, messages, pi, file.ValidateId);
+ });
+ }
+ else
+ {
+ ValidateDataAnnotations(propertyValue, context, messages, pi);
+ if (messages.Count == 0)
+ {
+ // 自定义验证组件
+ validator.ValidateProperty(propertyValue, context, messages);
+ }
+ }
+ }
+
private List