【问题标题】:Call MVC 3 Client Side Validation Manually for ajax posts为 ajax 帖子手动调用 MVC 3 客户端验证
【发布时间】:2011-07-04 21:50:54
【问题描述】:

我正在创建一个 MVC 3 Web 应用程序。我想在我的实体类上使用数据注释,然后在发回服务器之前使用不显眼的客户端验证。这在制作常规帖子时效果很好。如果任何字段无效,我会得到验证和验证摘要。但是,我想通过 ajax 和 json 发回信息。我怎样才能“手动”首先在客户端验证表单,然后让我的 ajax 回传到服务器。以下是我的代码的摘要版本。

  public class Customer
    {
        [Required(ErrorMessage = "The customer's first name is required.")]
        public string FirstName { get; set; }

        [Required(ErrorMessage = "The customer's last name is required.")]
        public string LastName { get; set; }
    }



    <% using (Html.BeginForm()) { %>

    <%: Html.LabelFor(model => model.FirstName, "First Name")%>
    <%: Html.TextBoxFor(model => model.FirstName, new { @class = "TextBox", id = "Customer.FirstName" })%>
    <%: Html.ValidationMessageFor(model => model.FirstName, "*")%>

    <%: Html.LabelFor(model => model.LastName, "Last Name")%>
    <%: Html.TextBoxFor(model => model.LastName, new { @class = "TextBox", id = "Customer.LastName" })%>
    <%: Html.ValidationMessageFor(model => model.LastName, "*")%>

    <div id="CustomerEditSave" class="Button CustomerEditButtons" style="margin-right:40px;">
       <a href="#">Save</a>
    </div>

    <%: Html.ValidationSummary(true) %>

    <% } %>

我试过这段代码,但它只验证名字,不显示验证摘要。

    $("#CustomerEditSave").click(function () {
        $(form).validate();
        //Ajax call here
    });

【问题讨论】:

    标签: javascript jquery asp.net-mvc validation asp.net-mvc-3


    【解决方案1】:

    试试:

    //using the form as the jQuery selector (recommended)
    $('form').submit(function(evt) {
        evt.preventDefault();
        var $form = $(this);
        if($form.valid()) {
            //Ajax call here
        }
    });
    
    //using the click event on the submit button
    $('#buttonId').click(function(evt) {
        evt.preventDefault();
        var $form = $('form');
        if($form.valid()) {
            //Ajax call here
        }
    });
    

    这应该适用于 jQuery ajax 和 MSAjax 调用。也可以尝试使用http://nuget.org/packages/TakeCommand.jshttps://github.com/webadvanced/takeCommand,它会自动为您处理。

    【讨论】:

    • 正如我在下面的评论中提到的 - 如果您没有通过返回 false 来明确处理提交操作的取消,那么在 click 中执行 ajax 调用可能会导致提交调用胜过 ajax 调用...这意味着解决方案需要编写两个函数而不是一个......
    • @DrRob,你永远不应该返回 false,你应该捕获 jQuery 事件作为参数并调用 preventDefault()。如果您的单击处理程序使用 return false 来阻止浏览器导航,则可能会导致解释器无法到达 return 语句,并且浏览器将继续执行锚标记的默认行为。这就是导致您的问题的原因,而不是因为您使用的是点击与提交。使用 event.preventDefault() 的好处是您可以将其添加为处理程序的第一行,从而保证锚的默认行为不会触发。
    • evt.preventDefault();喜欢这个现在一直使用它而不是返回 false。
    • @Paul-经过大量搜索,终于从您的回答中得到了解决方案。 :)
    【解决方案2】:

    我这几天一直在迷恋 MVC 客户端验证:

    不要使用 .click 使用 .submit:

    $("#MyForm").on('submit',function () {
    
        if($("#MyForm").valid())
        {
            //Do ajax stuff
        }
    
        //Return false regardless of validation to stop form submitting
        //prior to ajax doing its thing
        return false;
    });
    

    我要为此添加更新,考虑取消事件而不是返回 false(或两者都做):

    $("#MyForm").on('submit',function (e) {
    
        if($("#MyForm").valid())
        {
            //Do ajax stuff
        }
    
        e.preventDefault();
    
        //Return false regardless of validation to stop form submitting
        //prior to ajax doing its thing
        return false;
    });
    

    【讨论】:

    • 优秀的解决方案。非常感谢。过去几天我在这件事上浪费时间。
    • 另外请注意,请务必在页面上引用 jquery.validate.min.js 和 jquery.validate.unobtrusive.min.js ,否则您的表单将没有 .valid( ) 方法。
    • @juhan_h +1 - 完全同意你的看法......我一直忘记这一点;-)
    • -1。这个答案提出了一个错误的建议。请看我下面的帖子。它之所以有效,是因为您将 if 语句 ($("#MyForm).valid()) 包裹在 ajax 调用周围,而不是因为您使用 .submit 而不是 .click。两者都使用没有问题!
    • 调用 preventDefault() 怎么样?
    【解决方案3】:

    至少在我的情况下(MVC 5),还需要添加以下代码,否则 .valid() 将始终返回 true:

    $(function () {
    $(document).ajaxComplete(function(event, request, settings){
        //re-parse the DOM after Ajax to enable client validation for any new form fields that have it enabled
        $.validator.unobtrusive.parse(document);
    });
    

    });

    http://johnculviner.com/the-unobtrusive-libraries-client-validation-on-ajax-in-asp-net-mvc-3/

    【讨论】:

    • 哇!我一直在寻找这么久。终于偶然发现了这一点。非常感谢!
    【解决方案4】:

    重要!!:

    Paul 的解决方案是问题的正确答案,而不是 Rob 博士的解决方案。

    虽然你可以只使用 valid() 而不是 validate().form()。

    但更重要的是,确实没有理由像 Rob 博士建议的那样限制您的代码,即,不要使用 .click,而只能使用 .submit。那不是解决问题的方法!解决问题的方法是将 $.ajax(...) 调用包装在 if 语句中。即:

    if($("#MyForm").valid())
    {
        //call to $.ajax or equivalent goes in here.
    }
    

    我认为这需要澄清,否则问题的真正答案会被混淆。

    【讨论】:

    • 使用 Click 的问题是您仍然需要处理表单中的 Submit 事件。如果您使用 click 事件进行 ajax 调用,如果您没有明确处理,它可能会被 Submit 操作胜过......我的解决方案是,我敢肯定,我没有投票的众多解决方案之一是回答其他人所做的...正如我在帖子中所说,我花了很多时间试图让 Click 做它不想做的事情,一旦我切换到提交它就解决了“我的”问题。
    • 很抱歉用这篇文章复活了,但我想为路人添加一些输入。更明显的问题应该是您不必单击按钮来提交表单,这会导致跨浏览器出现一些奇怪的行为。如果用户在表单字段上按下回车键,浏览器可能会很好地寻找提交按钮来触发点击事件。否则,它只会在没有点击事件的情况下提交表单,提交按钮该死。毕竟,如果由于某种原因你有多个提交按钮......它怎么知道应该点击哪个提交?
    • @Aejay 我同意。我几乎停止在任何使用 Ajax 调用的代码中使用&lt;input type="submit" /&gt;。无论如何,我正在处理 Ajax 调用,无需添加可能提交的问题。只需使用&lt;input type="button" /&gt; 并处理您想要的任何操作。
    【解决方案5】:

    $(YourForm).data('unobtrusiveValidation').validate()

    【讨论】:

    • 欢迎使用 Stackoverflow,请说明为什么会这样。
    【解决方案6】:
            if(!$('#myform').data('unobtrusiveValidation').validate())
            {
               // add your extra custom logic
            } 
            else
            { 
                 $('#myform').submit(); 
            }
    

    它触发验证并返回一个布尔值,因此您可以在提交前检查。

    【讨论】:

      【解决方案7】:

      .Valid() 有效。即它告诉您您的表格是否有效。然而,单独它无助于正确显示和隐藏消息。这是我的手动验证方法

      function validate()
              {
                  //valid() not only tells us whether the form is valid but 
                  //also ensures that errors are shown !!!
                  if ($("form").valid())
                  {
                      //if the form is valid we may need to hide previously displayed messages
                      $(".validation-summary-errors").css("display", "none");
                      $(".input-validation-error").removeClass("input-validation-error");
                      return true;
                  }
                  else
                  {
                      //the form is not valide and because we are doing this all manually we also have to
                      //show the validation summary manually 
                      $(".validation-summary-errors").css("display", "block");
                      return false;
                  }
              }
      

      【讨论】:

        【解决方案8】:
        I tried all of the above solutions but none worked on MVC5. 
        

        我正在使用 jQuery v2.1.4 和 jQuery.Validation v1.11.1。 我需要在页面渲染时触发验证。只有以下一种对我有用。

        $(document).ready(function () {
           ...
           validateForm();
        }
        
        function validateForm() {`enter code here`
            var elem = document.getElementById('btnSave');
            elem.click();    
        }
        
        $('#btnSave').click(function (evt) {
            //evt.preventDefault();
            var form = $('form');
            if (form.valid()) {
                //Ajax call here
            }
            //$(".validation-summary-errors").css("display", "block");
        });
        
        function Validate() {
            // If no group name provided the whole page gets validated
            Page_ClientValidate();
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-06
          • 1970-01-01
          • 2012-07-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多