2011-03-29 66 views
9

如何将动态添加的控件添加到验证中?验证动态添加的控件

<div class="editor-field"> 
    @*@Html.EditorFor(model => model.Middlename)*@ 
    <div id="x"></div> 

    <script type="text/javascript"> 

     $(function() { 

      var newTextBoxDiv = $(document.createElement()); 

      newTextBoxDiv.html('<input type="text" name="Middlename" id="Middlename" width="100" data-val="true" data-val-required="The Middleneim field is required." />'); 

      newTextBoxDiv.appendTo('#x'); 
     }); 

    </script> 

    @Html.ValidationMessageFor(model => model.Middlename) 
</div> 

我注意到,当我不使用现成的功能,即

<script type="text/javascript"> 


var newTextBoxDiv = $(document.createElement()); 

newTextBoxDiv.html('<input type="text" name="Middlename" id="Middlename" width="100" data-val="true" data-val-required="The Middleneim field is required." />'); 

newTextBoxDiv.appendTo('#x'); 
</script> 

,客户端验证踢项。有没有办法将延期创建的输入明确包含到验证中?

+0

你想显示在页面的顶部有关错误的信息?如果是这样,那么你可以得到MiddleName值并验证它。如果它不是有效的输入,那么添加ModelState.AddModelError(“”,“”); – AEMLoviji 2011-03-29 06:23:31

+0

页面顶部没有错误,我使用的是ASP.NET MVC 3.默认是客户端验证。我想知道,当我没有使用jQuery的就绪函数时,一切都是正常的,即动态添加的输入与设计时添加的输入没有区别,它(动态添加的)也被验证(当用户输入时)如果它是必需的或不是 – 2011-03-29 06:26:50

回答

0

通过将值推入“验证器”的“window.mvcClientValidationMetadata”数组中,将其添加到MVC客户端验证在技术上是可行的。有一篇相当不错的文章here,其中显示了一些涉及的脚本和技术。这不会帮助你进行服务器端验证,但是因为客户端不会在没有JavaScript的情况下得到这个输入,所以你减轻了这一点。

我通常会对此应用更标准的渐进增强模式。默认创建中间名输入,并实现标准的MVC验证器。然后使用jQuery来隐藏它,除非(或直到)需要。当然这可能不符合你的要求,但如果是这样,那么我认为这是一个更好的方法。

1

UPDATE:这个答案是,如果你使用jQuery的不显眼的验证,你没有写你使用什么。

首先,这个插件添加到jQuery的准备: http://xhalent.wordpress.com/2011/01/24/applying-unobtrusive-validation-to-dynamic-content/

记住,你必须添加表单标签内的元素。让我们说你的标签有一些包装,我称之为“元素”。

后您的元素追加到DOM,称之为:

$.validator.unobtrusive.parseDynamicContent($(element).find("form").selector); 
var form = $(element).find("form"); 
$(form).valid(); 
    $(form).find("input").each(function() { 
     $(this).blur(function() { 
      $(this).valid(); 
     }); 
    }); 
    $(form).find("select").each(function() { 
     $(this).change(function() { 
      $(this).valid(); 
     });