2011-03-11 91 views
13

我正在尝试手动验证,以便通过AJAX发布我的表单。ASP.Net MVC 3使用动态表单验证客户端

ALSO我加载动态使用$("#formHolder").load(url);

当我加载页面到它始终验证为真DIV我的形式,即使我的输入框为空。

即电话if($("#MyForm").valid()) //is always true

但是如果我去的页面URL直接它工作正常。

所以,我怎么能初始化形式通过.load(url);加载它之后正确,因为它不存在于页面上首次打开时

我的JavaScript

$('.myLink').click(function() { 
    var url = '/newsletter/info/'; // this loads my HTML form from another page/view at runtime 
    $("#formHolder").load(url, function() { 
      $("#MyForm").validate(); // I thought this line would initialise it once it loads 
      }).dialog({ 
     modal: true, 
     width:800, 
     height: 600 
    }); 
    return false; 
}); 

回答

15

调用$.validator.unobtrusive.parse()形式已经被加载之后,手动作品

,我发现这里的解决方案http://btburnett.com/2011/01/mvc-3-unobtrusive-ajax-improvements.html

+0

位更改:$ .validator – Morteza 2012-11-11 12:48:32

+1

提示:您需要指定选择器:例如解析('body') – ulrichb 2013-08-28 07:40:27

+0

同意@ulrichb。没有选择器(或jQuery对象)它不适合我。顺便说一句:更大的范围将意味着最差的性能,所以应该发送'$(“#MyForm”)'或者你动态加载的任何元素来代替'body'' – Diego 2015-05-28 20:22:04

8

,如果你需要你的问题不指定做任何事情来自定义来验证表单,所以我肯定会用MVC3的内置jQuery不显眼的验证:

如果这是你的型号:

public class Person 
{ 
    [Required(ErrorMessage = "Email address required")] 
    [DataType(DataType.EmailAddress, ErrorMessage = "Please enter valid email address")] 
    public string Email { get; set; } 
} 

在您看来这个表单的代码将立即启用验证与设置的最低金额:

@model MvcApplication12.Models.Person 

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

@using (Ajax.BeginForm(new AjaxOptions())) { 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>Person</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Email) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Email) 
      @Html.ValidationMessageFor(model => model.Email) 
     </div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 

如果您想了解更多的功能,当表单发送您可以使用AjaxOptions:

new AjaxOptions() { UpdateTargetId = "formupdate", 
        OnSuccess = "javascript:alert('success');", 
        OnFailure = "javascript:alert('failure');", 
        OnComplete = "javascript:alert('complete');", 
        OnBegin = "javascript:alert('begin');" }) 

这使您可以在表单提交,完成,失败或开始时完全控制自定义操作。

希望这会有所帮助!

+0

谢谢,这是一个很好的答案,我从中学到了很多东西。然而,经过一番挖掘,我意识到我的问题只发生在表单加载时,我已经更新/改变我的问题,同时你回答。抱歉。但我认为你的电子邮件将有助于很多人一样 – Daveo 2011-03-11 13:10:34

+0

哈哈:)我敢肯定,这跟验证器-javascript如何挂钩事件有关。由于这些元素在页面加载时不存在,但稍后添加到DOM,因此它可能不会正确注册这些事件(例如,不使用.live())。我必须说,我从来没有使用过.validate()方法,所以不太确定那是做什么的。 – 2011-03-11 13:32:03

9

最好的解决方法是调用$.validator.unobtrusive.parse('#frmToBeValidated'),动态表单的你的Ajax负载之后。