前端带空格的JS枚举字符串转C#枚举的问题咨询
解决方案
方案一:前端请求前处理空格
在发送请求前,将ContactType字段值里的空格移除后再发送。可以选择单独处理请求数据,或者通过拦截器全局处理:
// 单独组装请求数据时处理 const requestPayload = { contactType: ContactType.Feedlot.replace(/\s+/g, ''), // 移除所有空格 // 其他请求字段... }; // 或用Axios拦截器全局处理 axios.interceptors.request.use(config => { if (config.data?.contactType && typeof config.data.contactType === 'string') { config.data.contactType = config.data.contactType.replace(/\s+/g, ''); } return config; });
方案二:后端接收时处理空格
如果不想改动前端代码,有两种后端处理方式:
方式1:自定义枚举转换器
继承StringEnumConverter,重写读取逻辑,先移除输入字符串的空格再转换:
public class SpaceIgnoringStringEnumConverter : StringEnumConverter { public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.String) { // 移除字符串中的所有空格 string processedValue = reader.Value.ToString().Replace(" ", string.Empty); // 调用基类方法完成枚举转换 return base.ReadJson(new JTokenReader(JToken.Parse($"\"{processedValue}\"")), objectType, existingValue, serializer); } return base.ReadJson(reader, objectType, existingValue, serializer); } }
然后替换原有转换器配置:
builder.Services .AddControllers() .AddNewtonsoftJson(options => { // 移除默认的StringEnumConverter options.SerializerSettings.Converters.RemoveAll(c => c is StringEnumConverter); // 添加自定义转换器 options.SerializerSettings.Converters.Add(new SpaceIgnoringStringEnumConverter()); });
方式2:给枚举加别名特性
直接给C#枚举的Feedlot字段添加EnumMember特性,指定匹配的字符串值:
public enum ContactType { Vendor, Buyer, [EnumMember(Value = "Feed Lot")] Feedlot, ... }
这样原有的StringEnumConverter就能直接识别"Feed Lot"并转换为Feedlot枚举值。
内容的提问来源于stack exchange,提问作者CorrieJanse
相关产品推荐
相关产品推荐

