You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)));
});

逻辑说明

  1. 优先判断输入是否为数字字符串,若是直接返回;
  2. 若输入是枚举名称(忽略大小写),解析为对应的枚举值后转成数字字符串;
  3. 若输入既不是数字也不是有效枚举名称,添加模型错误,触发API的模型验证逻辑。

内容的提问来源于stack exchange,提问作者Sam Carleton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 20:12:39