惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 【当耐特】
N
Netflix TechBlog - Medium
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
雷峰网
雷峰网
MongoDB | Blog
MongoDB | Blog
有赞技术团队
有赞技术团队
Engineering at Meta
Engineering at Meta
M
MIT News - Artificial intelligence
Google DeepMind News
Google DeepMind News
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
WordPress大学
WordPress大学
T
Tailwind CSS Blog
小众软件
小众软件
J
Java Code Geeks
人人都是产品经理
人人都是产品经理
博客园_首页
MyScale Blog
MyScale Blog
博客园 - 聂微东
V
Visual Studio Blog
The Cloudflare Blog
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
U
Unit 42

博客园 - Xia.CJ

C# 委托 node.js中连接mongodb(Please ensure that you set the default write...)解决办法 node.js api解读之file system模块 Node.js小技巧 在windows上安装新版node.js-node.js学习笔记 Asp.Net MVC部暑托管服务器iis7提示403错误解决方法 ashx中使用HttpContext.Current.Session ,出现未将对象引用设置到实例上 搜索引擎(google/百度)高级指令 在mvc3中使用uploadify上传组件User.isAuthenticated等于false解决方法 MVC中用Html.RenderPartial还是Html.RenderAction或者Html.Partial-Xia.CJ 在_Layout使用Html.RenderAction的问题-MVC3(Razor)问题 无法删除此对象,因为未在 ObjectStateManager 中找到它-entity framework删除时 Javascript数组(array)操作 序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用 entity framework(EF)_code first复杂类型(Complex Types)问题 entity framework多对多关系查询 JQuery获取checkbox值,checkbox全选,操作checkbox JQuery操作Select JQuery动态创建DOM、表单
mvc3中使用unobtrusive时,ajax更新加载页面后验证失效解决方法
Xia.CJ · 2012-06-30 · via 博客园 - Xia.CJ

    在使用mvc做项目时,针对应用时常遇问题,发现一个问题:当使用AJAX方式动态更新<input>内容或验证时,应如何让验证生效?

    依据jquery.validate.unobtrusive.js的运作原理,它会在网页载入后立即响应.$.validator.unobtrusive.parse(document)解析读取元素的data-val-*标示,完成检核条件设定,这也意味着事后加入<input>或追加data-val-*将不会被纳入表单送出前的检核项目。Brad Wilson在文章中有一节"Parsing New HTML For Validation"提到可呼叫jQuery.validator.unobtrusive.parse()或jQuery.validator.unobtrusive.parseElement()重新解析并设定检核条件,但经实测,除非整个<form>是动态重新产生的,否则parse()/parseElement()并无预期效果,<form>的检核条件仍维持onload事件所读取到的内容。

   查看源码,发现问题出在jquery.validate.unobtrusive.js里$("form”).validate(…)重新设定表单验证条件,但在jquery.validate.js中,form一旦被validate( )设定过,validator物件就会被保存在$(theForm).data(“validator”),之后再呼叫validate(options),会只传回原先的validator物件,而不会将options的内容并入validator :

<! DOCTYPE  html >
 
< html >
< head >
    < title > mvc3中使用unobtrusive时,ajax更新加载页面后验证失效解决方法 </ title >
    < script  src ="jQuery/jquery-1.6.2.js"  type ="text/javascript" >  </ script >   
    <script src= "jquery.validate/1.8.1/jquery.validate.js" type= "text/javascript" > </ script >   
    <script src= "jquery.validate.unobtrusive.js" type= "text/javascript" > </ script > 
   
    <script type= "text/javascript" >
        $( function () {
            //tReq新增数字检核
            $( "#tReq" ).attr( "data-val-number" , "须为数字(动态加上的检索)" );
            //无中生有新增一个<input id=tDyna>,并加上必填检核
            var id = "tDyna" ;
            $( "#dvDyna" ).append( "<input type='text' id='" + id + "' />" );
            $( "#tDyna" ).attr({
                name: id,
                "data-val" : "true" ,
                "data-val-required" : "不可空白(动态加上的检索
)" , }).after( "<span data-valmsg-for='" + id + "' />" ); 

//要先移除原有设定  $( "#form1" ).removeData( "validator" ); 

//方法一,传入新增检核设定的元素,包含该元素的<form>会重设检核条件 
//$.validator.unobtrusive.parseElement(document.getElementById("tDyna"));
//方法二,传入内含<input data-val="true">元素的容器selector,//将重新解析容器内的元素的data-val-*设定,接着所有的<form>会更新检核规则 
//$.validator.unobtrusive.parse("#dvDyna"); 
//在本案例中方法一、二都只更新了<input id='tDyna'>。<input id='tReq'>新增的 //data-val-number并未被解析生效,我们可扩大解析范围改善这个问题 
 $.validator.unobtrusive.parse( "#form1" ); //或parse(document)亦可  });
 </ script > 
</ head > 
< body > 
< form id ="form1" >
 < div >
 < input type ="text" id ="tReq" name ="tReq" data-val = "true" data-val-required = "不可空白" />
 < span data-valmsg-for ="tReq" ></ span > </ div > < div id ="dvDyna" > </ div > < input type ="submit" value ="Submit" />
 </ form > 
</ body > 
</ html >

     值得注意的是,$(theForm).removeData(“validator”)的解法会移除原有的检索设定 ,如果曾另外动态修改validator内容,移除validator将 导致事后修改一并失效。针对这个缺点,XHalent提出了更优雅的解法,撰写了一支parseDynamicContent() Plugin可将新增的检核条件合并进原有的validator物件中,但必须多载入jQuery Plugin,此一解决方案也一并提供大家参考。