ASP.NET Core 6中Double属性的Range与DataType验证未触发
解决ASP.NET Core 6服务器端验证自定义消息不生效问题
问题根源
当输入"ASD"这类非数字字符串时,ASP.NET Core的模型绑定器无法将其转换为double类型,会直接生成模型绑定错误——数据验证属性(如[DataType]、[Range])是在模型绑定成功后才执行的,因此自定义错误消息不会触发,显示的是模型绑定阶段的默认提示。
解决方案
方法1:手动替换绑定错误消息
在页面模型的提交处理方法中,检查并替换目标属性的绑定错误:
public async Task<IActionResult> OnPostAsync() { // 定位SpecialEquipmentAmount的格式转换错误 var amountError = ModelState["SpecialEquipmentAmount"]?.Errors.FirstOrDefault(e => e.Exception is FormatException); if (amountError != null) { ModelState["SpecialEquipmentAmount"].Errors.Clear(); ModelState["SpecialEquipmentAmount"].AddError("my message"); } if (!ModelState.IsValid) { return Page(); } // 业务逻辑处理 return RedirectToPage("./Success"); }
方法2:自定义验证属性
创建兼顾类型转换、范围验证的自定义属性,完全控制验证逻辑:
public class ValidCurrencyAttribute : ValidationAttribute { private readonly double _min; private readonly double _max; public ValidCurrencyAttribute(double min, double max) { _min = min; _max = max; ErrorMessage = "my message"; } protected override ValidationResult IsValid(object value, ValidationContext validationContext) { if (value == null || string.IsNullOrWhiteSpace(value.ToString())) { return new ValidationResult(ErrorMessage); } if (!double.TryParse(value.ToString(), out var amount)) { return new ValidationResult(ErrorMessage); } if (amount < _min || amount > _max) { return new ValidationResult(ErrorMessage); } return ValidationResult.Success; } }
修改页面模型属性的验证标记(若要彻底避免绑定错误,可将属性类型改为string):
[BindProperty] [Required(ErrorMessage = "my message")] [ValidCurrency(0.00, 999999999.99)] public string SpecialEquipmentAmount { get; set; } // 使用时手动转换为数值 double amount = double.Parse(SpecialEquipmentAmount);
方法3:全局配置绑定错误消息
若需统一应用内所有数字类型的绑定错误提示,在Program.cs中全局配置:
builder.Services.AddRazorPages() .AddMvcOptions(options => { options.ModelBindingMessageProvider.SetValueMustBeANumberAccessor( _ => "my message"); });
内容的提问来源于stack exchange,提问作者Fernando Gómez
相关产品推荐
相关产品推荐

