为ajax帖子手动调用MVC 3客户端验证

时间:2011-02-26 15:39:06

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

我正在创建一个MVC 3 Web应用程序。我想在我的实体类上使用Data Annotations,然后在回发到服务器之前使用不显眼的客户端验证。这在定期发布时工作正常。如果任何字段无效,我会得到验证和验证摘要。但是,我想通过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
    });

8 个答案:

答案 0 :(得分:93)

尝试:

//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,它会自动为您处理。

答案 1 :(得分:24)

我几天一直在使用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;
});

答案 2 :(得分:8)

至少在我的情况下(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/

答案 3 :(得分:3)

重要!!:

保罗的解决方案是问题的正确答案,而不是罗布博士。

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

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

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

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

答案 4 :(得分:0)

$(YourForm)。数据(&#39; unobtrusiveValidation&#39)。验证()

答案 5 :(得分:0)

        if(!$('#myform').data('unobtrusiveValidation').validate())
        {
           // add your extra custom logic
        } 
        else
        { 
             $('#myform').submit(); 
        }

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

答案 6 :(得分:0)

.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;
            }
        }

答案 7 :(得分:0)

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();
}