ASP.NET MVC模型类中Decimal的TypeConverter特性失效问题
解决方法
ASP.NET默认的模型绑定不会自动识别属性上标注的TypeConverter,这就是你的转换器断点从未触发的核心原因。不用修改全局模型绑定器,也不用添加额外属性,给目标属性补充一个ModelBinder特性即可解决问题。
1. 修改模型属性的特性配置
在原有TypeConverter特性下方,添加指定TypeConverterModelBinder的特性,让模型绑定过程调用你的自定义转换器:
using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ModelBinding.Binders; [TypeConverter(typeof(CommaDecimalConverter))] [ModelBinder(BinderType = typeof(TypeConverterModelBinder))] public decimal? Foo { get; set; }
2. 优化转换器逻辑(可选)
你的转换器核心逻辑没问题,可以补充空字符串判断,避免空输入时出现解析异常:
public class CommaDecimalConverter : DecimalConverter { public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is string text) { if (string.IsNullOrWhiteSpace(text)) return null; return decimal.Parse(text, new CultureInfo("cs-CZ")); } return base.ConvertFrom(context, culture, value); } }
完成以上修改后,模型绑定过程就会触发你的自定义转换器,断点能正常生效,同时实现了让decimal?属性接受逗号作为小数点分隔符的需求。
内容的提问来源于stack exchange,提问作者Stepan Michalek
相关产品推荐
相关产品推荐

