Asp.net MVC中表单验证
2009-02-15 16:55
555 查看
在Asp.netMVC中,View中我们仍然需要对提交的表单进行验证。通常验证分为客户端验证,服务端验证。
客户端验证,我们可以使用JQueryvalidationplugin,服务端验证,除了使用ModelState属性显示错误信息到
View,还可以使用FluentValidationfor.NET,一个小巧的.net验证框架,使用fluent的接口和lambda表达式对
你的业务对象构建验证规则。而且也有对应的MVC扩展。
我们首先增加一个验证UserEntity的验证类:
客户端验证,我们可以使用JQueryvalidationplugin,服务端验证,除了使用ModelState属性显示错误信息到
View,还可以使用
你的业务对象构建验证规则。而且也有对应的MVC扩展。
我们首先增加一个验证UserEntity的验证类:
usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Web; usingDemoMVCForm.Models; usingFluentValidation; usingFluentValidation.Validators; namespaceDemoMVCForm { ///<summary> ///UserValidation ///</summary> ///<remark>Author:PetterLiu2009-02-1515:54http://wintersun.cnblogs.com</remark> publicclassUserValidation:AbstractValidator<UserEntity> { ///<summary> ///Initializesanewinstanceofthe<seecref="UserValidation"/>class. ///</summary> ///<remark>Author:PetterLiu2009-02-1515:54 http://wintersun.cnblogs.com</remark> publicUserValidation() { RuleFor(u=>u.UserName).NotEmpty(); RuleFor(u=>u.UserName).Length(5,16); RuleFor(u=>u.Password).NotEmpty().WithMessage("必须输入密码"); RuleFor(u=>u.Email).NotEmpty(); RuleFor(u=>u.Email).EmailAddress(); RuleFor(u=>u.Url).Url(); RuleFor(u=>u.PassportID).NotEmpty(); } } ///<summary> ///UrlValidationRule<T> ///</summary> ///<typeparamname="T">T</typeparam> ///<remark>Author:PetterLiu2009-02-1515:54 http://wintersun.cnblogs.com</remark> publicclassUrlValidationRule<T>:RegularExpressionValidator<T> { ///<summary> ///Initializesanewinstanceofthe<seecref="UrlValidationRule<T>"/>class. ///</summary> ///<remark>Author:PetterLiu2009-02-1515:54 http://wintersun.cnblogs.com</remark> publicUrlValidationRule() :base(@"^http\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(/\S*)?$") { } } ///<summary> ///UrlValidationExtension ///</summary> ///<remark>Author:PetterLiu2009-02-1515:54 http://wintersun.cnblogs.com</remark> publicstaticclassUrlValidationExtension { publicstaticIRuleBuilderOptions<T,string>Url<T>(thisIRuleBuilder<T,string>ruleBuilder) { returnruleBuilder.SetValidator(newUrlValidationRule<T>()); } } }
看上增加了服务端验证规则多么简单的代码,比较直观。后又增加一个验证URL的规则,用于验证输入的URL。 接着来看,如何使用它:
///<summary> ///Registersthespecifieduser. ///</summary> ///<paramname="user">Theuser.</param> ///<returns></returns> ///<remark>Author:PetterLiu2009-02-1515:56http://wintersun.cnblogs.com</remark> publicJsonResultRegister(UserEntityuser) { UserValidationuserValidation=newUserValidation(); ValidationResultvalidationResult=userValidation.Validate(user); //adderrorstateinformationtoModelState. validationResult.AddToModelState(ModelState,"user"); boolvalidationSucceeded=validationResult.IsValid; IList<ValidationFailure>failures=validationResult.Errors; //returnresultforjsonformat. returnJson(failures); }
通过扩展的AddToModelState方法,能让验证的错误信息返回VIEW,但实际上如果没有使用Html.ValidationMessage, 也不需要这个方法了。看实际情况选择了。最后把验证后的结果对象:ValidationFarilure通过Json格式返回。 好,来看VIEW:
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <htmlxmlns="http://www.w3.org/1999/xhtml"> <headrunat="server"> <title>Demo</title> <styletype="text/css"> #inputArea { font-family:Arial,Sans-Serif; } #inputAreainput,#inputAreatextarea { font-family:Arial,Sans-Serif; margin-bottom:5px; padding:1px; border:solid1px#85b1de; } </style> <linkhref="http://www.cnblogs.com/Content/Site.css"rel="stylesheet"type="text/css"/> <scriptsrc="http://www.cnblogs.com/Scripts/jquery-1.3.1.js"type="text/javascript"></script> <scriptsrc="http://www.cnblogs.com/Scripts/jquery.validate.js"type="text/javascript"></script> <scriptsrc="http://www.cnblogs.com/Scripts/jquery.form.js"type="text/javascript"></script> <scripttype="text/javascript"> $(document).ready(function(){ functionProcessJson(data){ varret="服务器返回验证结果:\n" for(keyindata){ ret+=data[key].ErrorMessage; ret+="\n"; } alert(ret); } jQuery.validator.addMethod("usernamecheck",function(value,element){ returnthis.optional(element)||/^[a-zA-Z][a-zA-Z0-9_]{4,15}$/.test(value); },"5-16位字母开头,允许字母数字下划线") jQuery.validator.addMethod("ppIdcheck",function(value,element){ returnthis.optional(element)||/^[1-9]([0-9]{14}|[0-9]{17})$/.test(value); },"请输入正确的身份证号码(15-18位)") $("#form-sign-up").validate({ rules:{ password:{required:true,usernamecheck:""}, confirm_password:{required:true,minlength:8,equalTo:"#password"}, username:{ required:true, remote:'<%=Url.Action("IsLoginAvailable","FormDemo")%>' }, passportId: { required:true, ppIdcheck:"" } }, messages:{ confirm_password:{ required:"请填写一个密码", minLength:"长度必须8个字符", equalTo:"请输入与上面相同的密码" }, username:{ required:"请输入用户名", remote:jQuery.format("{0}已经有人用了") }, checkbox11: { required:"请打勾" } }, //setthisclasstoerror-labelstoindicatevalidfields success:function(label){ //setastextforIE label.html("").addClass("checked"); }, submitHandler:function(form){ varformoption={ dataType:"json", url:'<%=Url.Action("Register","FormDemo")%>', type:"post", success:ProcessJson//post-submitcallback }; $(form).ajaxSubmit(formoption); } }); }); </script> </head> <body> <formmethod="post"id="form-sign-up"> <h1> Demo表单</h1> <tableid="inputArea"> <tr> <td> 用户名(试试输入Petter): </td> <td> <inputtype="text"name="username"id="username"/> </td> </tr> <tr> <td> Email: </td> <td> <inputtype="text"name="email"id="email"class="requiredemail"/> </td> </tr> <tr> <td> Url: </td> <td> <inputtype="text"name="url"id="url"class="requiredurl"/> </td> </tr> <tr> <td> 密码: </td> <td> <inputtype="password"name="password"id="password"/> </td> </tr> <tr> <td> 确认密码: </td> <td> <inputtype="password"name="confirm_password"id="confirm_password"/> </td> </tr> <tr> <td> 记住密码 </td> <td> <inputtype="checkbox"name="checkbox11"id="checkbox"class="required"/> </td> </tr> <tr> <td> <labelfor="passportId"> 身份证号</label> <em>*</em> </td> <td> <inputtype="text"name="passportId"id="passportId"class="required"/> </td> </tr> <tr> <tdcolspan="2"align="center"> <br/> <inputtype="submit"id="btn1"value="提交"/> </td> </tr> </table> </form> </body> </html>
View中使用是JqueryValidation,同样是增加rule,用于客户端验证。具体可参考官方文档(后续有时间会放出中文版文档),以及之前这篇文章 《 JQuery+Asp.netMVC实现用户名重名查询》
小结:在WEB页面中,是一个数据进入的接口,对数据合法性,正确性非常重要。做好表单数据验证工作可以防止那些攻击数据,以及不合理数据。 通过使用客户端和服务端双重验证,可以保证表单数据安全性。有的时候客户端验证并不是太安全的,可以设法绕开验证提交表单。所以服务端验证 也是需要的。但为了减轻服务器压力,尽量使用客户端验证。以上只是一个小小例子,欢迎讨论。希望本文对您有帮助。
作者:PetterLiuhttp://wintersun.cnblogs.com
相关文章推荐
- asp.net MVC&JQuery 应用(表单验证)
- asp.net MVC&JQuery 应用(表单验证)
- ASP.NET MVC 客户端验证失败后表单仍然提交问题
- ASP.NET MVC 表单验证方式总结
- ASP.NET MVC Jquery Validate 表单验证的多种方式介绍
- ASP.NET MVC Preview 5 演示Demo #7 实现JQuery表单数据验证及JQuery操作Html元素
- 【转】asp.net MVC&JQuery 应用(表单验证)
- ValidationSugar表单验证框架-支持ASP.NET MVC ASP.NET WebFroM
- Asp.net MVC中表单验证属性的使用
- [翻译-ASP.NET MVC]Contact Manager开发之旅迭代3 - 验证表单
- [翻译-ASP.NET MVC]Contact Manager开发之旅迭代3 - 验证表单
- 详解ASP.NET MVC Form表单验证
- Asp.net Mvc 表单验证(气泡提示)
- HTML5中custom data-*特性与asp.net mvc 3 表单验证
- 【转】ASP.NET MVC 3.0 表单验证 - ASP.NET MVC 3 Remote Validation
- asp.net mvc 模型验证注解,表单提交
- [转]ASP.NET MVC Jquery Validate 表单验证的多种方式介绍
- Asp.net Mvc表单验证气泡提示效果
- ASP.NET MVC 4 (十三) 基于表单的身份验证
- ASP.NET MVC Jquery Validate 表单验证的多种方式