ASP.NET Core 5.0 MVC 自定义MaxLength等字段验证错误信息方法
自定义MaxLength验证错误提示实现方案
为什么Display特性对MaxLength提示不生效
MaxLengthAttribute的默认错误提示模板是框架内置的,和RequiredAttribute的默认逻辑不同——它不会自动读取Display特性配置的友好字段名来拼接提示文本,这就是单独设置Display后提示内容不变化的核心原因。
基础方案:直接在特性上配置自定义提示
这是最简便、无需额外代码的实现方式,框架原生支持,服务端、客户端非侵入式验证都会自动生效:
public class Model { [Required(ErrorMessage = "请填写姓名信息")] // 直接通过ErrorMessage参数指定自定义提示文本 [MaxLength(128, ErrorMessage = "姓名输入长度不能超过128个字符,请调整后提交")] public string Name { get; set; } }
如果希望提示文本自动关联Display配置的字段名、自动匹配配置的长度阈值,不需要手动写死内容,可以使用内置占位符:
[Display(Name = "用户姓名")] [MaxLength(128, ErrorMessage = "{0}的输入长度不能超过{1}个字符,请调整后提交")] public string Name { get; set; }
占位符的替换规则:
{0}自动替换为当前属性通过[Display]设置的友好名称{1}自动替换为MaxLength特性上配置的长度阈值
全局统一配置方案:重写验证特性逻辑
如果不想在每个MaxLength特性上重复写ErrorMessage,想要给所有长度校验设置统一的提示规范,就需要用到之前提到的「重写相关方法」的方案,完整实现逻辑如下:
- 派生自定义MaxLength特性类,重写错误消息格式化的核心方法
public class GlobalMaxLengthAttribute : MaxLengthAttribute { public GlobalMaxLengthAttribute(int length) : base(length) { } // 重写错误消息格式化逻辑,自定义统一的提示模板 public override string FormatErrorMessage(string name) { return $"{name}的输入长度超出上限,最多支持{Length}个字符,请调整后提交"; } } - 实现配套的客户端验证适配器,避免服务端提示和客户端提示不一致
很多参考帖子会遗漏这一步:如果只重写特性类,客户端的非侵入式验证还是会使用框架默认的提示文本,不会读取你自定义的格式化逻辑。需要自定义对应的适配器:public class GlobalMaxLengthAttributeAdapter : AttributeAdapterBase<GlobalMaxLengthAttribute> { public GlobalMaxLengthAttributeAdapter(GlobalMaxLengthAttribute attribute, IStringLocalizer stringLocalizer) : base(attribute, stringLocalizer) { } // 给前端验证组件注入校验规则和自定义提示 public override void AddValidation(ClientModelValidationContext context) { MergeAttribute(context.Attributes, "data-val", "true"); MergeAttribute(context.Attributes, "data-val-maxlength", GetErrorMessage(context)); MergeAttribute(context.Attributes, "data-val-maxlength-max", Attribute.Length.ToString()); } public override string GetErrorMessage(ModelValidationContextBase validationContext) { return Attribute.FormatErrorMessage(validationContext.ModelMetadata.GetDisplayName()); } } - 在MVC服务配置中注册自定义适配器的绑定规则
在项目Startup.cs的服务配置分支中,将自定义特性和对应的适配器做绑定:services.AddMvc(options => { // 注册自定义验证器的适配器映射 options.ClientModelValidatorProviders.Add(new ClientValidatorProvider(type => { if (type == typeof(GlobalMaxLengthAttribute)) { return typeof(GlobalMaxLengthAttributeAdapter); } return null; })); });
完成以上配置后,所有使用[GlobalMaxLength(128)]标记的属性,都会自动应用统一的提示规则,不需要单独配置ErrorMessage。
常见问题说明
- 遇到的"字段必须为长度为X的数组"这类异常提示,本质是早期.NET版本中MaxLength特性的资源文件定位错误,通过上述任意一种方案指定自定义ErrorMessage后即可直接解决,不需要额外修改框架源码。
- 单纯重写特性的
FormatErrorMessage方法而不注册客户端适配器,会出现服务端验证提示正确、表单失焦触发的客户端提示还是默认文本的不一致问题,这也是很多参考帖子没讲清楚的核心细节。
内容的提问来源于stack exchange,提问作者user15515307
相关产品推荐
相关产品推荐

