ASP.NET MVC如何实现自定义验证(服务端验证+客户端验证)
ASP.NET MVC通过Model验证帮助我们很容易的实现对数据的验证,在默认的情况下,基于ValidationAttribute的声明是验证被使用,我们只需要将相应的ValidationAttribute应用到Model的类型或者属性上即可。对于自定义验证,我们也只需要定义相应的Validation就可以了,不过服务端验证比较简单,而客户端验证就要稍微复杂一些,本文提供一个简单的实例说明在ASP.NET MVC中实现自定义验证的基本步骤。[源代码从这里下载] 一、AgeRangeAttribute用于验证出生日期字段以确保年龄在制定的范围之内的AgeRangeAttribute定义如下,简单起见,我们直接让它直接继承自RangeAttribute。服务端验证逻辑定义在重写的IsValid方法中,并且重写了FormatErrorMessage方法以便生成针对年龄的验证消息。AgeRangeAttribute实现了IClientValidatable接口,并在实现的GetClientValidationRules方法中生成客户端验证规则。在生成的类型为“agerange”的ModelClientValidationRule 对象中包含三个参数(currentdate、minage和maxage),分别表示当前日期(用于计算年龄)、允许年龄的范围。 1: public class AgeRangeAttribute : RangeAttribute,IClientValidatable 3: public AgeRangeAttribute(int minimum,int maximum) 5: { } 7: override bool IsValid(object value) 9: DateTime birthDate = (DateTime)value;
11: return age.Year >= (int)this.Minimum && age.Year <= (this.Maximum; 13:? 15: { 17: } 19: public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata,ControllerContext context)
21: ModelClientValidationRule validationRule = new ModelClientValidationRule(){ ValidationType = "agerange",ErrorMessage= FormatErrorMessage(metadata.DisplayName)}; 23: validationRule.ValidationParameters.Add("minage",1)">this.Minimum);
25: yield return validationRule; 27: } 二、注册客户端验证方法由于ASP.NET MVC采用JQuery Validation进行客户端验证,我们可以通过如下的这段javascript来注册用于实现客户端验证的function和添加相应的adapter。添加到jQuery.validator的用于进行年龄范围验证的function具有三个参数(value、element、params)分别表示被验证的值、元素和传入的参数。验证逻辑必须的三个数值(当前日期、年龄范围最小和最大值)通过参数params获得。而该参数实际上是在添加adapter时从通过上面定义的GetClientValidationRules方法生成的验证规则中获取的。 2: function (value,element,1)">params) {
4: var minAge = params.minage; var literalCurrentDate = params.currentdate;
9: var literalCurrentDates = literalCurrentDate.split('-'); ); 12: var birthDate = new Date(literalBirthDates[2],literalBirthDates[1],literalBirthDates[0]); var age = currentDate.getFullYear() - birthDate.getFullYear(); 16: }); 18: jQuery.validator.unobtrusive.adapters.add("maxage"],1)">function (options) {
20: currentdate: options.params.currentdate,
23: }; 25: }); 三、AgeRangeAttribute的应用现在我们将AgeRangeAttribute 应用到一个简单的ASP.NET MVC应用中。在通过VS的ASP.NET MVC项目模板创建的空Web应用中,我们定义了如下一个简单的Person类型,我们定义的AgeRangeAttribute 应用到了表示出生日期的BirthDate上,并将允许的年龄上、下限设置为18和30。 3: [DisplayName("姓名")]
5:? 7: [DisplayName("出生日期")]
public DateTime? BirthDate { get; set; } class HomeController : Controller 4: { 6: } public ActionResult Index(Person person) 10: return View(person);
12: } 如下所示的代码片断代表了View的定义,我们直接调用HtmlHelper<TModel>的扩展方法EditorModel将作为Model的Person对象以编辑模式呈现在一个表单中。最后一点不要忘了在Layout文件中讲包含上述javascript片断的js文件包含进来。 2: @using (Html.BeginForm())
4: @Html.EditorForModel() 6: } 运行我们的程序,输入不合法出生日期并点击”Save”按钮提交表单(针对第一次客户端验证),客户端验证将会生效,具体效果如下图所示。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – MVC组件GUI方法
- asp.net-mvc – 死简单的ASP.NET MVC 5密码保护?
- asp.net-core-mvc – “:exists”在路由模板上做了什么?
- asp.net access web.config denied
- asp.net-mvc – 具有Microsoft.AspNet.Identity的自定义成员
- 在控制台应用程序和asp.net Web应用程序之间共享配置
- rest – asp.net Web Api – 默认错误消息
- asp.net-mvc – Nuget如何指定包位置?
- asp.net-mvc – MVC 3布局页面,Razor模板和下拉列表
- asp.net – 如何以模态弹出窗口打开aspx页面
- 使用SQLite做本地数据缓存的思考
- asp.net-mvc-4 – ASP.NET帮助页面默认主页?
- asp.net – IIS如何知道它是服务于一个网站还是一
- asp.net中的身份验证Cookie
- asp.net – 使用HTML’readonly =“readonly”’
- asp.net-mvc – ASP.NET MVC – CustomeAuthoriz
- asp.net-mvc-3 – 在同一父视图上多次使用一个部
- asp.net – 如何在iframe中提交后刷新iframe父页
- asp.net-mvc – 在ASP.Net MVC中寻找转发器类型功
- asp.net-web-api2 – 在WebAPI2项目中加载System