如何修改Blazor验证器中int类型的默认错误提示信息
解决Blazor InputNumber默认验证提示替换及双重提示问题
问题原因分析
你遇到的双重提示问题本质在于:
- 当输入非整数内容时,
int类型的模型绑定会触发内置类型转换验证,弹出默认的“Quantity字段必须是数字”提示; - 同时
int类型默认值为0,添加[Range(1, ...)]特性后,输入非法内容时属性值仍为0,会触发范围验证,显示你自定义的提示,最终两个提示同时出现。
要将默认类型验证提示改为“数量字段必须是整数”并解决双重提示问题,推荐以下两种方案:
方案1:自定义验证属性(推荐)
创建一个同时处理类型转换和范围验证的自定义属性,既能替换默认提示,又能避免双重提示:
using System.ComponentModel.DataAnnotations; public class IntegerRangeAttribute : ValidationAttribute { public int Min { get; } public int Max { get; } public IntegerRangeAttribute(int min, int max) { Min = min; Max = max; } public override bool IsValid(object value) { // 处理空输入(若允许空可返回true) if (value == null || string.IsNullOrWhiteSpace(value.ToString())) return false; // 验证是否为整数 if (!int.TryParse(value.ToString(), out int number)) return false; // 验证范围 return number >= Min && number <= Max; } public override string FormatErrorMessage(string name) { // 根据验证失败原因返回对应提示 if (!int.TryParse(value?.ToString(), out _)) return "数量字段必须是整数"; return $"数量必须在{Min}到{Max}之间"; } }
在模型中使用该属性:
public class YourModel { [IntegerRange(1, 9999999999)] public int Quantity { get; set; } public decimal Width { get; set; } }
这样处理后:
- 输入非整数内容时,显示“数量字段必须是整数”;
- 输入超出范围的整数时,显示范围提示;
- 不会出现双重提示。
方案2:覆盖内置验证消息(全局/字段级)
如果你只想替换默认的类型转换提示,不需要合并范围验证,可以通过Blazor的验证消息机制覆盖内置提示:
- 在
Program.cs中配置本地化支持(即使不需要多语言,也可用于自定义提示):
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources"); var supportedCultures = new[] { new CultureInfo("zh-CN") }; app.UseRequestLocalization(new RequestLocalizationOptions { DefaultRequestCulture = new RequestCulture("zh-CN"), SupportedCultures = supportedCultures, SupportedUICultures = supportedCultures });
创建
Resources文件夹,添加DataAnnotationsResources.zh-CN.resx资源文件,添加键值对:- 键:
FieldMustBeNumeric,值:数量字段必须是整数 - 如果需要针对特定字段,键可以设为
Quantity_FieldMustBeNumeric,值同上
- 键:
为避免双重提示,将
Quantity改为可空整数int?,并添加[Required]特性(确保空输入时只触发Required提示,而非Range提示):
public class YourModel { [Required(ErrorMessage = "数量不能为空")] [Range(1, 9999999999, ErrorMessage = "数量必须在1到9999999999之间")] public int? Quantity { get; set; } public decimal Width { get; set; } }
这种方法适合全局替换验证提示,或者需要多语言支持的场景。
内容的提问来源于stack exchange,提问作者bilpor
相关产品推荐
相关产品推荐

