asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

ASP.NET MVC如何实现自定义验证


发布日期:2019年09月26日
 
ASP.NET MVC如何实现自定义验证
ASPNET MVC通过Model验证帮助我们很容易的实现对数据的验证在默认的情况下基于ValidationAttribute的声明是验证被使用我们只需要将相应的ValidationAttribute应用到Model的类型或者属性上即可对于自定义验证我们也只需要定义相应的Validation就可以了不过服务端验证比较简单而客户端验证就要稍微复杂一些本文提供一个简单的实例说明在ASPNET 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按钮提交表单(针对第一次客户端验证)客户端验证将会生效具体效果如下图所示

               

上一篇:ASP.NET MVC 3基础教程之Web Pages

下一篇:ASP.Net安装简明手册