ASP.NET MVC5验证系列之Remote Validation
大多数的开发者,可能会遇到这样的情况:当我们在创建用户之前,有必要去检查是否数据库中已经存在相同名字的用户。换句话说就是,我们要确保程序中,只有一个唯一的用户名,不能有重复的。相信大多数人都有不同的解决方法,但是asp.net mvc中,为我们提供了一个特性,就是remote validation,用它可以解决类似这样的问题。
remote validation调用了一个ajax请求,可以是get或者post方式,接着调用方法,这个方法,至少要有一个参数,并且方法的返回类型是json格式的。【mvc中通过jsonresult来做到】,这个方法的参数就是要验证的实体的属性【必须,否则不能验证,参数的大小写无所谓。】,如果这个验证的方法返回值是true,那么就表名存在相同的用户,我们就返回false,给前台页面。表明验证不通过。
好了,直接说正题吧!
首先新建一个空白的mvc项目,在model文件夹下,新建一个类remoteuser:
public class remoteuser { public string name { get; set; } public string email { get; set; } }
然后建一个测试的数据类:
public static class myremotestaticdata { public static list<remoteuser> remotelist { get { return new list<remoteuser>() { new remoteuser(){name="daniel",email="daniel@163.com"}, new remoteuser(){name="cfs",email="cfs@163.com"} }; } } }
在新建一个控制器myremotecontroller 【主要用来remote验证】:
using server_side_validation_in_mvc.staticdata; using system; using system.collections.generic; using system.linq; using system.web; using system.web.mvc; namespace server_side_validation_in_mvc.controllers { public class myremotecontroller : controller { // get: myremote public jsonresult remotevalidate(string name) //这里的参数名字,必须要和视图中文本框控件的名字一样,但大小写无所谓 { //如果存在用户名,即isexists=true bool isexists = myremotestaticdata.remotelist. where(s => s.name.tolowerinvariant(). equals(name.tolower())).firstordefault() != null; //就向前台返回false,表明已经存在username return json(!isexists,jsonrequestbehavior.allowget); } }
上面添加完验证之后,我们来修改一下model实体:
using system; using system.collections.generic; using system.linq; using system.web; using system.web.mvc; namespace server_side_validation_in_mvc.models { public class remoteuser { [remote("remotevalidate", "myremote", errormessage = "抱歉用户名已经存在!请重新输入!!!")] public string name { get; set; } public string email { get; set; } } }
然后在新建一个测试的控制器:
using system; using system.collections.generic; using system.linq; using system.web; using system.web.mvc; namespace server_side_validation_in_mvc.controllers { public class usercontroller : controller { public actionresult addremoteuser() { return view(); } } }
添加addremoteuser视图,【注意这里,remote validation是需要引入jquery插件和启用客户端验证的】
这里勾选引入脚本库,也主要是用来引入jquery插件。
@model server_side_validation_in_mvc.models.remoteuser @{ viewbag.title = "addremoteuser"; } <h2>addremoteuser</h2> @using (html.beginform()) { @html.antiforgerytoken() <div class="form-horizontal"> <h4>remoteuser</h4> <hr /> @html.validationsummary(true, "", new { @class = "text-danger" }) <div class="form-group"> @html.labelfor(model => model.name, htmlattributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @html.editorfor(model => model.name, new { htmlattributes = new { @class = "form-control" } }) @html.validationmessagefor(model => model.name, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @html.labelfor(model => model.email, htmlattributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @html.editorfor(model => model.email, new { htmlattributes = new { @class = "form-control" } }) @html.validationmessagefor(model => model.email, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="create" class="btn btn-default" /> </div> </div> </div> } <div> @html.actionlink("back to list", "index") </div> <script src="~/scripts/jquery-1.10.2.min.js"></script> <script src="~/scripts/jquery.validate.min.js"></script> <script src="~/scripts/jquery.validate.unobtrusive.min.js"></script>
然后修改一下默认的路由:
public static void registerroutes(routecollection routes) { routes.ignoreroute("{resource}.axd/{*pathinfo}"); routes.maproute( name: "default", url: "{controller}/{action}/{id}", defaults: new { controller = "user", action = "addremoteuser", id = urlparameter.optional } ); }
运行项目:
输入测试数据:cfs,按tab键后,自动就进行验证了。
这里我们对name字段就进行了remote验证,现在我想对email字段进行验证,需要使用到additionalfields,属性,还需要另外添加一个验证方法:
using server_side_validation_in_mvc.staticdata; using system; using system.collections.generic; using system.linq; using system.web; using system.web.mvc; namespace server_side_validation_in_mvc.controllers { public class myremotecontroller : controller { // get: myremote public jsonresult remotevalidate(string name) //这里的参数名字,必须要和视图中文本框控件的名字一样,但大小写无所谓 { //如果存在用户名,即isexists=true bool isexists = myremotestaticdata.remotelist. where(s => s.name.tolowerinvariant(). equals(name.tolower())).firstordefault() != null; //就向前台返回false,表明已经存在username return json(!isexists,jsonrequestbehavior.allowget); } public jsonresult remotevalidationaddtional(string name, string email) { //如果存在用户名,即isexists=true bool isexists = myremotestaticdata.remotelist. where(s => s.name.tolowerinvariant(). equals(name.tolower()) && s.email.tolowerinvariant().equals(email.tolower())).firstordefault() != null; //就向前台返回false,表明已经存在username return json(!isexists, jsonrequestbehavior.allowget); } } }
然后修改对应的实体类:
using system; using system.collections.generic; using system.linq; using system.web; using system.web.mvc; namespace server_side_validation_in_mvc.models { public class remoteuser { [remote("remotevalidate", "myremote", errormessage = "抱歉用户名已经存在!请重新输入!!!")] public string name { get; set; } //注意,这里的additionalfields="name",name字段必须和modle中的字段完全一样 [remote("remotevalidationaddtional", "myremote", additionalfields = "name", errormessage = "抱歉email已经存在!请重新输入!!!")] public string email { get; set; } } }
接着运行项目:
输入在测试类中写的测试数据:
这里就对两个字段进行了remote validation了。
上面使用了additionalfields 验证字段,如果我们想要验证不只一个字段,可以在addtionalfiled里面添加,以逗号分隔就行了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。