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