问题描述
我的页面功能是:一个输入框,用户输入信息之后,我要进行异步验证,post信息到我的ashx去验证信息,(我用的是validate里的remote属性)失去焦点、keyup、提交表单都会触发验证,一般情况下可以正常使用。现在问题来了:当我没有给予过这个输入框焦点的情况下,(有的情况下需求是帮使用者填充一些已知信息在输入框内,或者由于一些特殊原因,所以有可能使用者压根不用编辑输入框,所以不曾给予输入框焦点),直接点击提交按钮,页面只是刷新了一下,并没有走按钮的后台方法。设断点跟下来发现此时只是post信息到ashx,ashx返回验证结果,之后回到页面pageload方法。而我只要编辑一下输入框里内容,再点击按钮,就一切正常了。请问在不改动需求的情况下,怎么解决这个问题呢?
解决方案
解决方案二:
validate部分代码$("#form1").validate({rules:{"<%=txtMobile.UniqueID%>":{required:true,isMobile:true,remote:{type:"post",url:"/checkinformation.ashx",data:{validateType:"IsMobileCam",campaignName:function(){return'<%=campaignName%>';},mobile:function(){return$.trim($("#<%=txtMobile.ClientID%>").val());}},dataType:"html",dataFilter:function(data,type){if(data=="true")returntrue;elsereturnfalse;}}},
解决方案三:
完全没看懂需求你验证的是什么,不是文本内容是否合法吗,文本根本没有编辑过,它必然是合法的,还验证什么
解决方案四:
引用2楼Z65443344的回复:
完全没看懂需求你验证的是什么,不是文本内容是否合法吗,文本根本没有编辑过,它必然是合法的,还验证什么
谢谢解答,上面我没说清楚的地方我再描述一下需求就是自动填充的内容还是需要验证的,比如:我用我的手机号登录了页面,去报名一个活动,(这里报名和注册是两回事)报名的手机号我可以填充我的,也可以填充其他人的,为别人报名(需要短信验证码),我现在是为使用者把报名手机号自动填充成他登录的手机号,但是他的手机号有可能已经被别人报名过了,不能重复报名,所以需要验证此信息
解决方案五:
自己顶一下……
解决方案六:
web开发第一课,永远不要相信客户端代码,所以不管你在文本框失去焦点或者keyup事件或者提交表单的时候做了什么验证,在你的.ashx中都需要再验证一次,客户端的验证是可以没有的,加客户端验证只是为了更好的用户体验,服务器端的验证才是必须的。
解决方案七:
引用5楼CityBird的回复:
web开发第一课,永远不要相信客户端代码,所以不管你在文本框失去焦点或者keyup事件或者提交表单的时候做了什么验证,在你的.ashx中都需要再验证一次,客户端的验证是可以没有的,加客户端验证只是为了更好的用户体验,服务器端的验证才是必须的。
谢谢提示,的确,除了客户端前台验证,后台也是有验证的,只是现在这个坎过不去。我要怎样才能又让他验证了没有获得过焦点的输入框,又能执行后台button方法呢?
解决方案八:
点击按钮的时候做同步验证
解决方案九:
点击提交按键事件里。在验证一次。
解决方案十:
话说,判断手机号是否已经在数据库中存在,这个明显是个后台验证,需要访问数据库的你纠结前台验证干嘛?前台验证不过是验证一些字符串是否合法,如果手机号输入的根本不是数字,就根本没必要把数据提交到服务器再回发回来,直接告诉用户不合法就完了
解决方案十一:
前台验证,不过是验证一些信息是否为空,如果必填项为空,不必发送数据,直接告诉用户需要填写,都填写全了,再服务端验证一次看是否真正合法前台验证也可以直接让非法字符无法录入进文本框里总之,前台验证只是验证字符串是否符合规范,不要再去访问后台的东西后台的东西就应该放到后台验证里去
解决方案十二:
引用9楼Z65443344的回复:
话说,判断手机号是否已经在数据库中存在,这个明显是个后台验证,需要访问数据库的你纠结前台验证干嘛?前台验证不过是验证一些字符串是否合法,如果手机号输入的根本不是数字,就根本没必要把数据提交到服务器再回发回来,直接告诉用户不合法就完了
这个是需求问题,我也没有办法,要求的就是用户输入完了马上显示出来这个手机号能不能用,当然了,后台也是有判断的,这个是必须的,因为前台的验证很容易跨越过去
解决方案十三:
引用10楼Z65443344的回复:
前台验证,不过是验证一些信息是否为空,如果必填项为空,不必发送数据,直接告诉用户需要填写,都填写全了,再服务端验证一次看是否真正合法前台验证也可以直接让非法字符无法录入进文本框里总之,前台验证只是验证字符串是否符合规范,不要再去访问后台的东西后台的东西就应该放到后台验证里去
谢谢解答,这也是种思路,不过现在需求限制。我更想了解的是怎么解决这个post之后就不走后台方法的问题(之前我所说的特殊情况下)
解决方案十四:
不客气的说,你这个需求有点问题,前台判断几乎都是通过正则式判断是否合法,至于数据是否重复,当然必须到后台判断,至于你说的那种效果,我想也许你用一个label+textchanged事件或者类似的方法,然后通过页面局部刷新,应该可以办到,但是归根结底,不可能谁可以不通过后台数据库就能判断数据是否重复的
解决方案十五:
引用13楼wzhenhang的回复:
不客气的说,你这个需求有点问题,前台判断几乎都是通过正则式判断是否合法,至于数据是否重复,当然必须到后台判断,至于你说的那种效果,我想也许你用一个label+textchanged事件或者类似的方法,然后通过页面局部刷新,应该可以办到,但是归根结底,不可能谁可以不通过后台数据库就能判断数据是否重复的
不是不通过后台,我用的是前台post信息到ashx,ashx再进行判断,给页面返回结果
解决方案:
文本框失去焦点的时候做ajax异步验证,点击按钮的时候再次做ajax同步验证,后台处理的时候再次做验证。
解决方案:
除了异步验证,再在提交的时候验证输入框的信息是否正确,否则给予焦点,returnfalse;