InputMask取消掩码后仍格式错误,decimal类型字段绑定失败
InputMask取消掩码后仍格式错误,decimal类型字段绑定失败
兄弟,我太懂你被这个问题卡两天的憋屈感了!咱们来捋捋这个InputMask和decimal字段绑定的坑到底咋填。
首先得搞明白问题根源:你用InputMask给输入框加了千分位分隔符(.),但ASP.NET MVC默认的decimal模型绑定器根本不认这种带分隔符的格式——哪怕你觉得已经取消了掩码,提交时输入框里的数值可能还是带着.,直接导致后端绑定失败,触发验证错误。
给你几个靠谱的解决方案,按顺序试:
1. 让InputMask提交时自动移除掩码格式
这是最直接的办法,修改你的InputMask配置,加上removeMaskOnSubmit: true这个关键参数,这样表单提交时会自动把格式化后的数值转成纯数字传给后端:
Inputmask.extendAliases({ 'myNum': { alias: 'currency', digits: 0, digitsOptional: false, // 强制整数位 integerDigits: 12, // 最大整数位数 prefix: '', // 不加前缀 groupSeparator: '.', // 千分位分隔符 removeMaskOnSubmit: true // 提交时自动移除掩码! } }); // 绑定到你的Total输入框 $('#Total').inputmask('myNum');
2. 自定义模型绑定器兼容带分隔符的数值
如果上面的配置还是不好使,那咱们就从后端入手,写个自定义的decimal绑定器,让它能识别带.分隔的字符串并转成decimal:
先创建绑定器类:
public class DecimalModelBinder : IModelBinder { public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var inputValue = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); if (inputValue == null) return null; var rawValue = inputValue.AttemptedValue; if (string.IsNullOrWhiteSpace(rawValue)) return null; // 移除千分位的`.`,再尝试转成decimal var cleanValue = rawValue.Replace(".", ""); if (decimal.TryParse(cleanValue, out decimal result)) { return result; } // 转失败就加错误信息 bindingContext.ModelState.AddModelError(bindingContext.ModelName, "Harga格式不正确"); return null; } }
然后注册这个绑定器,如果你是ASP.NET MVC 5及之前,就在Global.asax的Application_Start里加:
ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder()); ModelBinders.Binders.Add(typeof(decimal?), new DecimalModelBinder()); // 兼容可空decimal
如果是ASP.NET Core,就在Startup.cs的ConfigureServices里注册:
services.AddControllersWithViews(options => { options.ModelBinderProviders.Insert(0, new BinderTypeModelBinderProvider(typeof(DecimalModelBinder))); });
3. 额外排查点
- 提交表单前打开浏览器控制台,查看FormData里的
Total值是不是纯数字,如果还是带.,那得检查InputMask的绑定有没有生效; - 要是用了Unobtrusive Validation,确保相关脚本(jquery.validate.js、jquery.validate.unobtrusive.js)都正确引用了,避免客户端验证干扰;
- 实在不行,给InputMask加个
onUnMask事件手动处理值:
$('#Total').inputmask('myNum', { onUnMask: function(maskedValue, unmaskedValue) { // 强制返回纯数字 return unmaskedValue.replace(/\./g, ''); } });
备注:内容来源于stack exchange,提问作者Jun Rikson
相关产品推荐
相关产品推荐

