From 473d10533a76e136344f4366d275fb5424bd0bd4 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Mon, 19 Jan 2026 14:25:59 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BB=91=E5=AE=9A=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IRaCIS.Core.API/Progranm.cs | 2 +- .../LegacyController/ModelActionFilter .cs | 61 ++++++++++++++----- 2 files changed, 48 insertions(+), 15 deletions(-) diff --git a/IRaCIS.Core.API/Progranm.cs b/IRaCIS.Core.API/Progranm.cs index c80a2171a..394625ba5 100644 --- a/IRaCIS.Core.API/Progranm.cs +++ b/IRaCIS.Core.API/Progranm.cs @@ -97,7 +97,7 @@ builder.Services.AddJsonLocalization(options => options.ResourcesPath = "Resourc builder.Services.AddControllers(options => { // 插到最前,抢在默认绑定器之前 - options.ModelBinderProviders.Insert(0, new NullableStructModelBinderProvider()); + //options.ModelBinderProviders.Insert(0, new NullableStructModelBinderProvider()); options.Filters.Add(); options.Filters.Add(); diff --git a/IRaCIS.Core.Application/BusinessFilter/LegacyController/ModelActionFilter .cs b/IRaCIS.Core.Application/BusinessFilter/LegacyController/ModelActionFilter .cs index abe4800de..8095e55b8 100644 --- a/IRaCIS.Core.Application/BusinessFilter/LegacyController/ModelActionFilter .cs +++ b/IRaCIS.Core.Application/BusinessFilter/LegacyController/ModelActionFilter .cs @@ -38,30 +38,38 @@ public class NullableStructModelBinderProvider : IModelBinderProvider // 获取要绑定的模型类型,比如 Guid?, int?, DateTime? 等 var type = context.Metadata.ModelType; + //创建默认的模型绑定器(系统的原逻辑) + var fallback = context.CreateBinder(context.Metadata); + + + // 1. 处理 string 类型 + if (type == typeof(string)) + { + return new StringNotNullableModelBinder(fallback); + } + // 检查是否是 Nullable 类型 // 1. 必须是泛型类型 // 2. 泛型定义必须是 Nullable<> - if (!type.IsGenericType || - type.GetGenericTypeDefinition() != typeof(Nullable<>)) - return null; // 返回 null 表示"我不处理这个类型" + if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) + { + // 获取可空类型内部的实际类型,如 Guid?, int? 中的 Guid, int + var innerType = Nullable.GetUnderlyingType(type)!; - // 获取可空类型内部的实际类型,如 Guid?, int? 中的 Guid, int - var innerType = Nullable.GetUnderlyingType(type)!; + var binderType = typeof(NullableEmptyStringToNullBinder<>).MakeGenericType(innerType); - // 创建默认的模型绑定器(系统的原逻辑) - var fallback = context.CreateBinder(context.Metadata); + // 实例化绑定器,传入默认绑定器作为备用 + return (IModelBinder)Activator.CreateInstance(binderType, fallback)!; + } - // 创建泛型绑定器类型:NullableEmptyStringToNullBinder - // 比如对于 Guid?,会创建 NullableEmptyStringToNullBinder - var binderType = typeof(NullableEmptyStringToNullBinder<>).MakeGenericType(innerType); - // 实例化绑定器,传入默认绑定器作为备用 - return (IModelBinder)Activator.CreateInstance(binderType, fallback)!; + return null; // 返回 null 表示"我不处理这个类型" + } } -// 泛型约束:T 必须是值类型(struct),这确保了只处理可空值类型 +// 泛型约束:T 必须是值类型(struct),这确保了只处理可空值类型 比如处理guid? 传递"" 为null public class NullableEmptyStringToNullBinder : IModelBinder where T : struct { private readonly IModelBinder _fallbackBinder; @@ -91,4 +99,29 @@ public class NullableEmptyStringToNullBinder : IModelBinder where T : struct // 比如将 "123" 转换为 int? 123,或将 GUID 字符串转换为 Guid? await _fallbackBinder.BindModelAsync(context); } -} \ No newline at end of file +} + +// 处理 string 的绑定器 如果前端不传递 或者null 时 处理为 "" +public class StringNotNullableModelBinder : IModelBinder +{ + private readonly IModelBinder _fallbackBinder; + + public StringNotNullableModelBinder(IModelBinder fallbackBinder) + { + _fallbackBinder = fallbackBinder; + } + + public async Task BindModelAsync(ModelBindingContext context) + { + var value = context.ValueProvider.GetValue(context.ModelName).FirstValue; + + // 前端不传或传空字符串,都设为 string.Empty + if (string.IsNullOrWhiteSpace(value)) + { + context.Result = ModelBindingResult.Success(string.Empty); + return; + } + + await _fallbackBinder.BindModelAsync(context); + } +}