加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

[ASP.NET MVC]如何定制Numeric属性/字段验证消息

发布时间:2020-12-16 09:06:18 所属栏目:asp.Net 来源:网络整理
导读:对于一个Numeric属性/字段,ASP.NET MVC会自动进行数据类型的验证(客户端验证),以确保输入的是一个有效的数字,但是呈现在页面上的错误消息总是一段固定的文本:“The field {0} must be a number”,本篇提供一种解决方案使我们可以对此验证消息进行定制

对于一个Numeric属性/字段,ASP.NET MVC会自动进行数据类型的验证(客户端验证),以确保输入的是一个有效的数字,但是呈现在页面上的错误消息总是一段固定的文本:“The field {0} must be a number”,本篇提供一种解决方案使我们可以对此验证消息进行定制。[源代码从这里下载]

目录
一、针对Numeric属性/字段默认验证消息
二、默认的验证消息来源于何处?
三、通过自定义ModelValidatorProvider替换NumericModelValidator
四、注册自定义ModelValidatorProvider

一、针对Numeric属性/字段默认验证消息

我们先来通过一个简单的例子来验证这个问题,为此我们定义了如下一个表示员工信息的Employee类型,其中代表年龄的Age属性类型为整型。

   1: public class Employee
   3:     [Display(Name = "姓名")]
   5:? 
   7:     string Gender { get; set; }
   9:     [Display(Name = "年龄")]
  11: }

我们创建一个Model类型为Employee的View对某个元员工的信息进行修改。如下图所示,当我们输入一个非数字字符串作为Age字段的时候,验证错误信息显示为“The field 年龄 must be a number”,值得一提的是:当前线程的CurrentUICulture为zh-CN。

二、默认的验证消息来源于何处?

针对数字类型字段进行验证的是一个名称为NumericModelValidator的ModelValidator,不过这是个定义在System.Web.Mvc程序集中俄内部类型。如果采用Reflector查看其定义,可以发现用于返回错误消息的方法是一个名为MakeErrorString的静态方法。如下面的代码所示,作为错误消息的字符串来源于内嵌于程序集中的资源文件。

   3:     //其他成员
   5:     {
   7:     }
class NumericAttribute : ValidationAttribute,IClientValidatable
   4:     {
   6:     }
   8:     {
  10:     }
class FilterableClientDataTypeModelValidatorProvider : ClientDataTypeModelValidatorProvider
   5:         var allValidators = base.GetValidators(metadata,context);
   7:         foreach (var v in allValidators)
   9:             if (v.GetType().Name != "NumericModelValidator")
  11:                 validators.Add(v);
  13:             else
  15:                 NumericAttribute attribute = new NumericAttribute{ ErrorMessage = Resources.FieldMustBeNumeric};
  17:                 validators.Add(validator);
  19:         }
  21:     }
class MvcApplication : System.Web.HttpApplication
   5:     { 
   7:         var clientDataTypeValidator = ModelValidatorProviders.Providers.OfType<ClientDataTypeModelValidatorProvider>().FirstOrDefault();
   9:         {
  11:         }
  13:     }