ASP.NET
MVC通过Model验证援助大家很简单的落到实处对数据的评释,在私下认可的事态下,基于ValidationAttribute的注脚是表达被选拔,大家只要求将相应的ValidationAttribute应用到Model的类型可能性质上即可。对于自定义表明,大家也只须求定义相应的Validation
就能够了,然则服务端验证相比简单,而客户端验证就要有点复杂壹些,本文提供一个简练的实例证实在ASP.NET
MVC中落实自定义表达的中央步骤。[源代码从这里下载]

一、AgeRangeAttribute


于验证出生日期字段以保证年龄在制定的限量以内的AgeRangeAttribute定义如下,不难起见,我们一向让它1直接轨自
RangeAttribute。服务端验证逻辑定义在重写的IsValid方法中,并且重写了FormatErrorMessage方法以便生成针对年龄
的认证消息。AgeRangeAttribute完结了IClientValidatable接口,并在实现的
GetClientValidationRules方法中生成客户端验证规则。在白云苍狗的档次为“agerange”的
ModelClientValidationRule
对象中含有多个参数(currentdate、minage和maxage),分别代表目今天子(用于计算年龄)、允许年龄的限制。

   1: public class AgeRangeAttribute : RangeAttribute, IClientValidatable

   2: {

   3:     public AgeRangeAttribute(int minimum, int maximum)

   4:         : base(minimum, maximum)

   5:     { }

   6:  

   7:     public override bool IsValid(object value)

   8:     {

   9:         DateTime birthDate = (DateTime)value;

  10:         DateTime age = new DateTime(DateTime.Now.Ticks - birthDate.Ticks);

  11:         return age.Year >= (int)this.Minimum && age.Year <= (int)this.Maximum;

  12:     }

  13:  

  14:     public override string FormatErrorMessage(string name)

  15:     {

  16:         return base.FormatErrorMessage("年龄");

  17:     }

  18:  

  19:     public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)

  20:     {

  21:         ModelClientValidationRule validationRule = new ModelClientValidationRule(){ ValidationType = "agerange", ErrorMessage= FormatErrorMessage(metadata.DisplayName)};

  22:         validationRule.ValidationParameters.Add("currentdate",DateTime.Today.ToString("dd-MM-yyyy"));

  23:         validationRule.ValidationParameters.Add("minage",this.Minimum);

  24:         validationRule.ValidationParameters.Add("maxage",this.Maximum);

  25:         yield return validationRule;

  26:     }

  27: }

2、注册客户端验证方法

是因为ASP.NET MVC选用JQuery
Validation实行客户端验证,大家能够通过如下的那段javascript来注册用于落到实处客户端验证的function和增加相应的
adapter。添加到jQuery.validator的用于举行年龄限制验证的function具有多个参数(value、element、
params)分别表示被评释的值、成分和传布的参数。验证逻辑必须的多个数值(当今日期、年龄限制一点都不大和最大值)通过参数params得到。而该参数实
际上是在添加adapter时从通过上边定义的GetClientValidationRules方法生成的注解规则中获取的。

   1: jQuery.validator.addMethod("agerange",

   2: function (value, element, params) {

   3:     

   4:     var minAge = params.minage;

   5:     var maxAge = params.maxage;

   6:  

   7:     var literalCurrentDate = params.currentdate;

   8:     var literalBirthDate = value;

   9:     var literalCurrentDates = literalCurrentDate.split('-');

  10:     var literalBirthDates = literalBirthDate.split('-');

  11:  

  12:     var birthDate = new Date(literalBirthDates[2], literalBirthDates[1], literalBirthDates[0]);

  13:     var currentDate = new Date(literalCurrentDates[2], literalCurrentDates[1], literalCurrentDates[0]);

  14:     var age = currentDate.getFullYear() - birthDate.getFullYear();

  15:     return age >= minAge && age <= maxAge

  16: });

  17:  

  18: jQuery.validator.unobtrusive.adapters.add("agerange", ["currentdate", "minage", "maxage"], function (options) {

  19:     options.rules["agerange"] = {

  20:         currentdate: options.params.currentdate,

  21:         minage: options.params.minage,

  22:         maxage: options.params.maxage

  23:     };

  24:     options.messages["agerange"] = options.message;

  25: });

三、AgeRangeAttribute的应用

当今我们将AgeRangeAttribute 应用到2个简练的ASP.NET
MVC应用中。在通过VS的ASP.NET
MVC项目模板创立的空Web应用中,大家定义了如下1个简单的Person类型,大家定义的AgeRangeAttribute
应用到了表示出破壳日期的BirthDate上,并将允许的年龄上、下限设置为18和30。

   1: public class Person

   2: {

   3:     [DisplayName("姓名")]

   4:     public string Name { get; set; }

   5:  

   6:     [AgeRange(18, 30, ErrorMessage = "{0}必须在{1}和{2}之间!")]   

   7:     [DisplayName("出生日期")]

   8:     [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd-MM-yyyy}")]

   9:     public DateTime? BirthDate { get; set; }

  10: }

下一场大家添加如下多少个HomeController,在暗许的Action方法Index中大家将创设的Person对象突显在暗许的View中。

   1: public class HomeController : Controller

   2: {

   3:     public ActionResult Index()

   4:     {

   5:         return View(new Person{ BirthDate = DateTime.Today, Name = "Foo"});

   6:     }

   7:     [HttpPost]

   8:     public ActionResult Index(Person person)

   9:     {

  10:         return View(person);

  11:     }

  12: }

如下所示的代码片断代表了View的定义,大家一向调用HtmlHelper<TModel>的扩大方法艾德itorModel将用作
Model的Person对象以编制格局表未来四个表单中。最终一点毫无忘了在Layout文件中讲包蕴上述javascript片断的js文件包罗进
来。

   1: @model Person

   2: @using (Html.BeginForm())

   3: {     

   4:     @Html.EditorForModel()

   5:     <input type="submit" value="Save" />

   6: }

运维大家的次第,输入违规出生日期并点击”Save”按钮提交表单(针对第三遍客户端验证),客户端验证将会生效,具体职能如下图所示。

图片 1

相关文章

网站地图xml地图