2014-02-05 86 views
0

全部,动态添加验证规则到MVC3

我需要将验证规则添加到用户添加的动态表单输入文本元素。

我通过克隆HTML的一大块,提供唯一的ID,并添加到DOM

实现这个我研究这个语法,我相信这是正确的但我得到下面的JS错误,当我尝试访问.rules方法:

TypeError: $(...).rules is not a function 

由此引起:

$("input[type=text].validateRequired").each(function() { 

    $(this).rules("add", { required: true, messages: { required: "Data is missing" } 

    });  
}); 

当我在FireBug中检查$(this)时,我没有看到.rules方法,但它存在于验证脚本中,并且所有文档都显示该方法应在全局可用。不知道如何获得它的范围。

这里是代码段中查看与此相关的问题:

JS包括

<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script> 

创建动态表单元素JS方法

<script type="text/javascript"> 
    $(document).ready(function() { 

     var uniqueId = 1; 
     var ctr = 1; 
     $(function() { 
      $('.js-add-cosponsor-hyperlink').click(function() { 

       var copy = $("#cosponsorsTemplate").clone(true).appendTo("#addCosponsorSection").hide().fadeIn('slow'); 
       var cosponsorDivId = 'cosponsors_' + uniqueId; 
       var copyText = copy.html(); 

       copyText = copyText.replace(/Guitar1/g, 'Guitar' + ctr); 
       copyText = copyText.replace('Guitar_1', 'Guitar_' + ctr); 
       copy.html(copyText); 
       $('#cosponsorsTemplate').attr('id', cosponsorDivId); 



       var deleteLink = copy.find("a.icon.delete"); 
       deleteLink.on('click', function() { 
        copy.fadeOut(300, function() { $(this).remove(); }); //fade out the removal 

       }); 


       $.validator.unobtrusive.parse(form); 
       $("input[type=text].validateRequired").each(function() { 

        var t = $(this); 
        $(this).rules("add", { required: true, messages: { required: "Data is missing" } }); 
       }); 

       uniqueId++; 
       ctr++; 
      }); 
     }); 
    }); 

</script> 

* 表格 *

@using (Html.BeginForm()) 
    { 
     [...] 


     <!-- Template used to do the Clone: These need dynamic validation --> 

     <div style="display:none"> 
     <div id="cosponsorsTemplate"> 
       <div class="formColumn1"><label>Guitar</label></div> 
      <div class="formColumn2">@Html.TextBoxFor(model => model.Guitar1.Make, new { Placeholder = "Make", Class = "validateRequired" }) 
       <div class="messageBottom"> 
          @Html.ValidationMessageFor(model => model.Guitar1.Make) 
       </div> 
      </div> 
       <div class="formColumn3">@Html.TextBoxFor(model => model.Guitar1.Model, new { Placeholder = "Model" , Class = "validateRequired"}) 
        <div class="messageBottom"> 
         @Html.ValidationMessageFor(model => model.Guitar1.Model) 
        </div> 
       </div> 
       <div class="formColumn4">@Html.TextBoxFor(model => model.Guitar1.ProductionYear, new { Placeholder = "Production Year", Class = "validateRequired" }) 
          <div class="messageBottom"> 
           @Html.ValidationMessageFor(model => model.Guitar1.ProductionYear) 
          </div><a class="icon delete">Delete</a> 
          </div> 

      </div> 
    </div>  
    <!-- End Add Co-Sponsor Row Template --> 
    } 

回答

0

你是克隆的HTML的一大块所以每次你做一个克隆时,你需要使用$ .validator.unobtrusive.parse

+0

不能去,要么解析整个窗体 : TypeError:$ .validator未定义 $ .validator.unobtrusive.parse(form); – Slinky

+0

它看起来像你没有包含Javascript Vaidate插件的正确参考。看到这篇文章http://stackoverflow.com/questions/12407312/jquery-validation-plugin-error-typeerror-validator-is-undefined – Adrian

+0

图书馆在那里,因为他们做不显眼验证非动态元素就好 - 这是真奇怪 – Slinky