【问题标题】:ASP.Net MVC 3 client side validation with a dynamic form带有动态表单的 ASP.Net MVC 3 客户端验证
【发布时间】:2011-03-11 12:03:35
【问题描述】:

我正在尝试进行手动验证,以便可以通过 AJAX 发布我的表单。

另外我正在使用$("#formHolder").load(url);动态加载我的表单

当我将页面加载到 DIV 中时,它始终验证为 true,即使我的输入框是空的。

即致电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;
});

【问题讨论】:

    标签: jquery asp.net-mvc-3 jquery-validate


    【解决方案1】:

    在表单加载完成后手动调用$.validator.unobtrusive.parse()

    我在这里找到了解决方案http://btburnett.com/2011/01/mvc-3-unobtrusive-ajax-improvements.html

    【讨论】:

    • 提示:您需要指定一个选择器:例如解析('body')
    • 同意@ulrichb。如果没有选择器(或 jQuery 对象),它对我不起作用。顺便说一句:更大的范围意味着最差的性能,所以你应该发送$("#MyForm") 或者你动态加载的任何元素,而不是'body'
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你的问题没有说明你是否需要做任何自定义来验证表单,所以我肯定会使用 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');" })
      

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

      希望这会有所帮助!

      【讨论】:

      • 谢谢,这是一个很好的答案,我确实从中学到了很多东西。但是,经过一番挖掘后,我意识到我的问题仅在动态加载表单并且我在您回答的同时显着更新/更改了我的问题时才会出现。对不起。但我认为你的电子邮件同样会帮助许多人
      • aha :) 我很确定这与 validator-javascript 如何连接事件有关。由于页面加载时元素不存在,但稍后会添加到 DOM,因此它可能无法正确注册事件(例如,不使用 .live() )。我必须说我从未使用过 .validate() 方法,所以不太确定它的作用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 2014-07-21
      相关资源
      最近更新 更多