ASP.NET Core 6 Web API自定义绑定:枚举名称转数字字符串
ASP.NET Core 6 Web API 自定义绑定:将枚举名称字符串转为数字字符串
实现自定义模型绑定器
创建一个实现IModelBinder接口的绑定器,专门处理Status属性的输入转换逻辑:
using Microsoft.AspNetCore.Mvc.ModelBinding; using System.Globalization; public class StatusEnumBinder : IModelBinder { public Task BindModelAsync(ModelBindingContext bindingContext) { if (bindingContext == null) throw new ArgumentNullException(nameof(bindingContext)); var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); if (valueProviderResult == ValueProviderResult.None) return Task.CompletedTask; var inputValue = valueProviderResult.FirstValue; if (string.IsNullOrEmpty(inputValue)) { bindingContext.Result = ModelBindingResult.Success(null); return Task.CompletedTask; } // 若输入已是数字字符串,直接返回 if (int.TryParse(inputValue, out _)) { bindingContext.Result = ModelBindingResult.Success(inputValue); return Task.CompletedTask; } // 尝试将枚举名称解析为枚举值,再转为数字字符串 if (Enum.TryParse<StatusEnum>(inputValue, ignoreCase: true, out var statusEnum)) { var numericStatus = ((int)statusEnum).ToString(CultureInfo.InvariantCulture); bindingContext.Result = ModelBindingResult.Success(numericStatus); return Task.CompletedTask; } // 解析失败时添加模型错误 bindingContext.ModelState.TryAddModelError( bindingContext.ModelName, $"无效的状态值:{inputValue},请传入数字或有效的枚举名称(Pending/InProgress/Completed/Failed/OnHold)"); bindingContext.Result = ModelBindingResult.Failed(); return Task.CompletedTask; } }
绑定到视图模型属性
修改TaskViewModel,给Status属性添加[ModelBinder]特性,指定使用上面的自定义绑定器:
public enum StatusEnum { Pending = 1, InProgress = 2, Completed = 3, Failed = 4, OnHold = 5 } public class TaskViewModel { [ModelBinder(BinderType = typeof(StatusEnumBinder))] public string Status { get; set; } public string TaskName { get; set; } public DateTime Deadline { get; set; } }
全局注册绑定器(可选)
如果需要多个属性复用这个绑定器,可以在Program.cs中全局注册绑定器提供者:
builder.Services.AddControllers(options => { options.ModelBinderProviders.Insert(0, new BinderTypeModelBinderProvider(typeof(StatusEnumBinder))); });
逻辑说明
- 优先判断输入是否为数字字符串,若是直接返回;
- 若输入是枚举名称(忽略大小写),解析为对应的枚举值后转成数字字符串;
- 若输入既不是数字也不是有效枚举名称,添加模型错误,触发API的模型验证逻辑。
内容的提问来源于stack exchange,提问作者Sam Carleton
相关产品推荐
相关产品推荐

