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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:15:03