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

如何将C#枚举类型序列化为整数用于下拉框绑定?

解决枚举JSON序列化输出整数及下拉框绑定问题

不需要必须用枚举字符串作为下拉框值,完全可以用枚举的整数值来实现绑定,下面给你几个可行的方案:

方案1:调整JsonConverter特性

当前你用JsonConverter(typeof(JsonStringEnumConverter))强制序列化枚举为字符串,要输出整数的话:

  • 如果只是单个属性需要改,直接移除该属性上的JsonConverter特性即可,默认JSON序列化(不管是Newtonsoft.Json还是System.Text.Json)都会把枚举序列化为对应的整数值。
  • 如果全局配置了JsonStringEnumConverter(比如在Startup/Program.cs里设置了全局转换器),针对单个属性可以指定用默认的枚举转换器:
    • Newtonsoft.Json:
      [JsonConverter(typeof(EnumConverter))]
      public RoundingType RoundingSetting { get; set; }
      
    • System.Text.Json:
      [JsonConverter(typeof(JsonNumberEnumConverter))]
      public RoundingType RoundingSetting { get; set; }
      

方案2:自定义JSON转换器(灵活场景)

如果需要在不同场景切换序列化方式,或者要兼容输入的字符串/整数解析,可以写自定义转换器。以Newtonsoft.Json为例:

public class RoundingTypeIntConverter : JsonConverter<RoundingType>
{
    // 反序列化:支持整数或字符串输入
    public override RoundingType ReadJson(JsonReader reader, Type objectType, RoundingType existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Integer)
        {
            return (RoundingType)Convert.ToInt32(reader.Value);
        }
        if (reader.TokenType == JsonToken.String)
        {
            return Enum.Parse<RoundingType>(reader.Value.ToString());
        }
        throw new JsonSerializationException("无法转换为RoundingType枚举");
    }

    // 序列化:输出整数
    public override void WriteJson(JsonWriter writer, RoundingType value, JsonSerializer serializer)
    {
        writer.WriteValue((int)value);
    }
}

然后在属性上应用这个转换器:

[JsonConverter(typeof(RoundingTypeIntConverter))]
public RoundingType RoundingSetting { get; set; }

下拉框绑定的最佳实践

用枚举整数作为下拉框的value完全可行,而且更稳定(不会因为枚举名称变更失效)。建议后端返回包含整数值和显示文本的下拉选项列表,显示文本可以用枚举的Description属性,比如:

  1. 先写一个获取枚举描述的扩展方法:
public static string GetEnumDescription(this Enum enumVal)
{
    var field = enumVal.GetType().GetField(enumVal.ToString());
    var descAttr = field.GetCustomAttribute<DescriptionAttribute>();
    return descAttr?.Description ?? enumVal.ToString();
}
  1. 生成下拉选项列表:
public List<SelectListItem> GetRoundingTypeOptions()
{
    return Enum.GetValues(typeof(RoundingType))
               .Cast<RoundingType>()
               .Select(e => new SelectListItem
               {
                   Value = ((int)e).ToString(),
                   Text = e.GetEnumDescription()
               })
               .ToList();
}

把这个列表返回给前端,就能直接绑定下拉框,value是整数,显示的是友好的描述文本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 14:52:23