ASP.NET Core MVC数字字段验证问题:输入框允许输入字母e如何解决
ASP.NET Core MVC RUT字段校验异常解决方案
问题根源
- HTML5
type="number"输入框原生允许输入大小写字母e,该字符属于规范定义的科学计数法合法字符,浏览器默认不会拦截 - 若你的模型中
PAC_RUT字段定义为数值类型(int、long等),RegularExpression、StringLength数据注解本质为字符串校验规则,对数值类型字段不生效,因此现有校验逻辑无法拦截e字符输入
修复步骤
1. 调整模型字段配置
RUT属于身份标识类字段,无需参与数值运算,建议修改为字符串类型,同时优化校验注解:
// 字段改为string类型 [Required(AllowEmptyStrings = false, ErrorMessage = "RUT为必填项")] [RegularExpression(@"^\d{1,10}$", ErrorMessage = "仅允许输入数字,最大长度为10位")] [StringLength(10, ErrorMessage = "RUT最大长度为10位")] public string PAC_RUT { get; set; }
如果需要保留原西班牙文错误提示,直接沿用你原有配置即可。
2. 调整前端输入框逻辑
方案A:改为text类型输入框(更推荐)
使用普通文本输入框,配合输入实时过滤,从源头禁止非数字字符输入:
<div class="form-group col-md-6"> <label>RUT Paciente:</label> <input asp-for="MODEL_PACIENTE.PAC_RUT" type="text" placeholder="RUT" class="form-control" autofocus oninput="value=value.replace(/[^\d]/g,'')" maxlength="10"/> <span asp-validation-for="MODEL_PACIENTE.PAC_RUT" class="text-danger"></span> </div>
方案B:保留number类型,拦截e字符输入
如果一定要保留数字输入框的上下箭头交互,增加键盘事件拦截e的输入,同时补充粘贴拦截避免绕过:
<div class="form-group col-md-6"> <label>RUT Paciente:</label> <input asp-for="MODEL_PACIENTE.PAC_RUT" type="number" placeholder="RUT" class="form-control" autofocus onkeydown="return event.key !== 'e' && event.key !== 'E'" onpaste="return !clipboardData.getData('text').includes('e') && !clipboardData.getData('text').includes('E')" max="9999999999"/> <span asp-validation-for="MODEL_PACIENTE.PAC_RUT" class="text-danger"></span> </div>
3. 服务端兜底校验
提交表单时先判断ModelState.IsValid,即使前端校验被恶意绕过,服务端的数据注解也会触发校验,返回对应错误信息。
注意事项
如果PAC_RUT字段对应数据库字段原为数值类型,修改模型字段为字符串后需要同步调整数据库字段类型,避免类型映射错误。
内容的提问来源于stack exchange,提问作者Carrobe90
相关产品推荐
相关产品推荐

