ASP
NET MVC通过Model验证帮助我们很容易的实现对数据的验证
在默认的情况下
基于ValidationAttribute的声明是验证被使用
我们只需要将相应的ValidationAttribute应用到Model的类型或者属性上即可
对于自定义验证
我们也只需要定义相应的Validation就可以了
不过服务端验证比较简单
而客户端验证就要稍微复杂一些
本文提供一个简单的实例说明在ASP
NET MVC中实现自定义验证的基本步骤
一AgeRangeAttribute
用于验证出生日期字段以确保年龄在制定的范围之内的AgeRangeAttribute定义如下简单起见我们直接让它直接继承自RangeAttribute服务端验证逻辑定义在重写的IsValid方法中并且重写了FormatErrorMessage方法以便生成针对年龄的验证消息AgeRangeAttribute实现了IClientValidatable接口并在实现的GetClientValidationRules方法中生成客户端验证规则在生成的类型为agerange的ModelClientValidationRule 对象中包含三个参数(currentdateminage和maxage)分别表示当前日期(用于计算年龄)允许年龄的范围
: public class AgeRangeAttribute : RangeAttribute IClientValidatable
: {
: public AgeRangeAttribute(int minimum int maximum)
: : base(minimum maximum)
: { }
:
: public override bool IsValid(object value)
: {
: DateTime birthDate = (DateTime)value;
: DateTime age = new DateTime(DateTimeNowTicks birthDateTicks)
: return ageYear >= (int)thisMinimum && ageYear <= (int)thisMaximum;
: }
:
: public override string FormatErrorMessage(string name)
: {
: return baseFormatErrorMessage(年龄)
: }
:
: public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata ControllerContext context)
: {
: ModelClientValidationRule validationRule = new ModelClientValidationRule(){ ValidationType = agerange ErrorMessage= FormatErrorMessage(metadataDisplayName)};
: validationRuleValidationParametersAdd(currentdateDateTimeTodayToString(ddMMyyyy))
: validationRuleValidationParametersAdd(minagethisMinimum)
: validationRuleValidationParametersAdd(maxagethisMaximum)
: yield return validationRule;
: }
: }
二注册客户端验证方法
由于ASPNET MVC采用JQuery Validation进行客户端验证我们可以通过如下的这段javascript来注册用于实现客户端验证的function和添加相应的adapter添加到jQueryvalidator的用于进行年龄范围验证的function具有三个参数(valueelementparams)分别表示被验证的值元素和传入的参数验证逻辑必须的三个数值(当前日期年龄范围最小和最大值)通过参数params获得而该参数实际上是在添加adapter时从通过上面定义的GetClientValidationRules方法生成的验证规则中获取的
: jQueryvalidatoraddMethod(agerange
: function (value element params) {
:
: var minAge = paramsminage;
: var maxAge = paramsmaxage;
:
: var literalCurrentDate = paramscurrentdate;
: var literalBirthDate = value;
: var literalCurrentDates = literalCurrentDatesplit()
: var literalBirthDates = literalBirthDatesplit()
:
: var birthDate = new Date(literalBirthDates[] literalBirthDates[] literalBirthDates[])
: var currentDate = new Date(literalCurrentDates[] literalCurrentDates[] literalCurrentDates[])
: var age = currentDategetFullYear() birthDategetFullYear()
: return age >= minAge && age <= maxAge
: })
:
: jQueryvalidatorunobtrusiveadaptersadd(agerange [currentdate minage maxage] function (options) {
: optionsrules[agerange] = {
: currentdate: optionsparamscurrentdate
: minage: optionsparamsminage
: maxage: optionsparamsmaxage
: };
: ssages[agerange] = ssage;
: })
三AgeRangeAttribute的应用
现在我们将AgeRangeAttribute 应用到一个简单的ASPNET MVC应用中在通过VS的ASPNET MVC项目模板创建的空Web应用中我们定义了如下一个简单的Person类型我们定义的AgeRangeAttribute 应用到了表示出生日期的BirthDate上并将允许的年龄上下限设置为和
: public class Person
: {
: [DisplayName(姓名)]
: public string Name { get; set; }
:
: [AgeRange( ErrorMessage = {}必须在{}和{}之间!)]
: [DisplayName(出生日期)]
: [DisplayFormat(ApplyFormatInEditMode = true DataFormatString = {:ddMMyyyy})]
: public DateTime? BirthDate { get; set; }
: }
然后我们添加如下一个HomeController在默认的Action方法Index中我们将创建的Person对象呈现在默认的View中
: public class HomeController : Controller
: {
: public ActionResult Index()
: {
: return View(new Person{ BirthDate = DateTimeToday Name = Foo})
: }
: [HttpPost]
: public ActionResult Index(Person person)
: {
: return View(person)
: }
: }
如下所示的代码片断代表了View的定义我们直接调用HtmlHelper<TModel>的扩展方法EditorModel将作为Model的Person对象以编辑模式呈现在一个表单中最后一点不要忘了在Layout文件中讲包含上述javascript片断的js文件包含进来
: @model Person
: @using (HtmlBeginForm())
: {
: @HtmlEditorForModel()
: <input type=submit value=Save />
: }
运行我们的程序输入不合法出生日期并点击Save按钮提交表单(针对第一次客户端验证)客户端验证将会生效具体效果如下图所示