MVC3 използва jquery.validate.unobtrusive.js и $(#form).submit() hijax не работи

Имам основна форма

@Html.ValidationSummary(true)
using (Html.BeginForm("Index", "Home", FormMethod.Post, new { @class = "form" }))
{
     <div class="editor-label">
         <label for="Name">@Html.LabelFor(model => model.Name)</label>
     </div>
     <div class="editor-field">
         @Html.EditorFor(model => model.Name)
     </div>

и така нататък. Моят модел използва анотации към данни и валидирането е включено.

Отвличам формата с помощта на jquery:

<script type="text/javascript">
    $("form[action='/']").submit(function () {
        $.post($(this).attr("action"), $(this).serialize(), function (response) {
            $("#contactForm").replaceWith($("#contactForm", response));
        });
        return false;
    });
</script>

Това работи, ако напиша правилно полетата и изпратя. Но странното е, че ако въведа невалидна стойност в едно от полетата на формуляра и кодът за валидиране се включи, за да подчертае грешката ми, функцията за изпращане на събитие, която добавих в скрипта за отвличане по-горе, се губи и се получава пълна публикация.

Някакви добри идеи как да заобиколя това?


person Tom Miller    schedule 31.10.2011    source източник


Отговори (1)


Мисля, че когато добавите манипулатор за изпращане към формуляра си, вие презаписвате манипулатора за изпращане, който jquery валидирането/анотациите на данни добавя.

За да заобиколите това, можете да добавите:

var theForm = $(this);
if ( theForm.valid() ) {
    $.post($(this).attr("action"), $(this).serialize(), function (response) {
        $("#contactForm").replaceWith($("#contactForm", response));
    });
    return false;
}

Това ще гарантира, че формулярът е валиден, преди да направите POST.

person Dismissile    schedule 31.10.2011
comment
Благодаря. Изглежда това е проблемът. - person Tom Miller; 31.10.2011
comment
@Dismissile Не виждам къде закачате изпращането? вероятно просто пропускам нещо, денят беше дълъг :) - person Adam Tuliper - MSFT; 04.11.2011
comment
@AdamTuliper кодът, който Dismissile даде, е в допълнение към това, което Том Милър вече имаше. - person Tigran; 25.06.2012