dyskretna weryfikacja nie działa z zawartością dynamiczną


96

Mam problemy z próbą uzyskania dyskretnej walidacji jQuery do pracy z częściowym widokiem, który jest ładowany dynamicznie przez wywołanie AJAX.

Spędziłem dni próbując zmusić ten kod do działania bez powodzenia.

Oto widok:

@model MvcApplication2.Models.test

@using (Html.BeginForm())
{
 @Html.ValidationSummary(true);
 <div id="res"></div>
 <input id="submit" type="submit" value="submit" />
}

Częściowy widok:

@model MvcApplication2.Models.test

@Html.TextAreaFor(m => m.MyProperty);
@Html.ValidationMessageFor(m => m.MyProperty);

<script type="text/javascript" >
  $.validator.unobtrusive.parse(document);
</script>

Model:

  public class test
  {
    [Required(ErrorMessage= "required field")]
    public int MyProperty { get; set; }
  }

Kontroler:

    public ActionResult GetView()
    {
        return PartialView("Test");
    }

i na koniec javascript:

$(doument).ready(function () {
$.ajax({
    url: '/test/getview',
    success: function (res) {

        $("#res").html(res);
        $.validator.unobtrusive.parse($("#res"));
    }
});

$("#submit").click(function () {
    if ($("form").valid()) {
        alert('valid');
        return true;
    } else {
        alert('not valid');
        return false;
    }
});

Walidacja nie działa. Nawet jeśli nie wypełnię żadnych informacji w polu tekstowym, zdarzenie przesyłania pokazuje alert („ważny”).

Jeśli jednak zamiast dynamicznie ładować widok, używam @Html.Partial("test", Model)do renderowania częściowego widoku w głównym widoku (i nie wykonuję wywołania AJAX), wtedy walidacja działa dobrze.

Dzieje się tak prawdopodobnie dlatego, że jeśli ładuję zawartość dynamicznie, kontrolki jeszcze nie istnieją w DOM. Ale wykonuję wywołanie, $.validator.unobtrusive.parse($("#res")); które powinno wystarczyć, aby pozwolić walidatorowi o nowo załadowanych kontrolkach ...

Czy ktoś może pomóc?


Miałem też ten sam problem, ale w mvc 2. Przechodzę krok po kroku jako: weblogs.asp.net/imranbaloch/archive/2010/07/11/ ... To też może ci pomóc. weblogs.asp.net/imranbaloch/archive/2011/03/05/ ... Mam nadzieję, że ta pomoc :)
— Naresh Parmar

2
Zauważ, że unobtrusive.parsefunkcja przyjmuje selektor jako argument, a nie element.
— Fred

Odpowiedzi:


227

Jeśli spróbujesz przeanalizować formularz, który został już przeanalizowany, nie zostanie on zaktualizowany

To, co możesz zrobić, dodając element dynamiczny do formularza, to jedno i drugie

  1. Możesz usunąć weryfikację formularza i ponownie ją zweryfikować w następujący sposób:

    var form = $(formSelector)
        .removeData("validator") /* added by the raw jquery.validate plugin */
        .removeData("unobtrusiveValidation");  /* added by the jquery unobtrusive plugin*/
    
    $.validator.unobtrusive.parse(form);
    
  2. Uzyskaj dostęp do unobtrusiveValidationdanych formularza za pomocą datametody jQuery :

    $(form).data('unobtrusiveValidation')

    następnie uzyskaj dostęp do kolekcji reguł i dodaj nowe atrybuty elementów (co jest nieco skomplikowane).

Możesz również zapoznać się z tym artykułem na temat stosowania dyskretnej walidacji jQuery do zawartości dynamicznej w ASP.Net MVC dla wtyczki używanej do dodawania elementów dynamicznych do formularza. Ta wtyczka wykorzystuje drugie rozwiązanie.


17
Koleś, rządzisz, całkowicie uratowałeś mój dzień! Świetna odpowiedź!
— Dimitar Dimitrov

Bałem się, że sam zaproszę. Skrypt z tej strony działa jak urok.
— cezarypiatek

Kod działa świetnie - szybka aktualizacja (jeśli mogę) 1. Używam nokautu i dobrze sprawdzam nazwy pól to wygląda na problem. $ .validator.unobtrusive.parseDynamicContent („formularz”); (aby uzyskać wszystkie pola), na końcu podczas przesyłania. 2. To jest fajne johnnyreilly.github.io/jQuery.Validation.Unobtrusive.Native/…, aby dać ci sposób na nazwanie pól (co wydaje się być wymagane? okoliczności prawdopodobnie są inne)
— Richard Housham

Tylko uwaga, że ​​wszelkie ustawienia formularza, do których się zastosowałeś, $("form").data("validator").settingszostaną usunięte $(formSelector).removeData("validator")i zastąpione ustawieniami domyślnymi z $.validator.defaultspodczas ponownego parsowania formularza. Jest to świetny sposób na uwzględnienie pól dynamicznych, ale pamiętaj, aby powtórzyć każdy niestandardowy kod inicjujący przy każdej nowej analizie.
— KyleMit

19

Jako dodatek do odpowiedzi Nadeema Khedra ...

Jeśli dynamicznie załadowałeś formularz do swojego DOM, a następnie zadzwoń

jQuery.validator.unobtrusive.parse(form); 

(z wymienionymi dodatkowymi bitami), a następnie wyślemy ten formularz używając AJAX pamiętaj o wywołaniu

$(form).valid()

która zwraca prawdę lub fałsz (i uruchamia faktyczną weryfikację) przed przesłaniem formularza.


cześć, mam ten sam problem. pokazuję mój dynamiczny widok w wyskakującym okienku (okno dialogowe jQuery). dyskretne walidacje nie działają. gdzie mam wywołać $ (form) .valid () w moim widoku dynamicznym lub gdzie indziej?
— mmssaann

Zawsze uniemożliwiałem przesłanie formularza, zwracając wartość false wewnątrz $ (form) .submit, ponieważ robiłem przesyłanie AJAX, ale potem potrzebowałem sposobu, aby nie wywoływać przesyłania AJAX, gdy walidacja nie powiodła się. $ (form) .valid () jest odpowiedzią! Dziękuję Ci!
— jgerman

6

dodaj to do swojego _Layout.cshtml

 $(function () {
        //parsing the unobtrusive attributes when we get content via ajax
        $(document).ajaxComplete(function () {
            $.validator.unobtrusive.parse(document);
        });
    });

3
Jest to szczególnie nieefektywne.
— Liam

5

Co zaskakujące, kiedy przeczytałem to pytanie, oficjalna dokumentacja ASP.NET nadal nie zawierała żadnych informacji o dyskretnej parse()metodzie ani o tym, jak jej używać z dynamiczną zawartością. Pozwoliłem sobie stworzyć problem w repozytorium dokumentów (odwołując się do oryginalnej odpowiedzi @ Nadeem) i przesłać żądanie ściągnięcia, aby go naprawić. Te informacje są teraz widoczne w sekcji walidacji po stronie klienta w temacie walidacji modelu.


3

przetestuj to:

if ($.validator.unobtrusive != undefined) {
    $.validator.unobtrusive.parse("form");
}

2

Uderzył mnie ten sam problem i nic nie działało poza tym:

$(document).ready(function () { 
    rebindvalidators();
});

function rebindvalidators() {
    var $form = $("#id-of-form");
    $form.unbind();
    $form.data("validator", null);
    $.validator.unobtrusive.parse($form);
    $form.validate($form.data("unobtrusiveValidation").options);
}

i dodaj

// Check if the form is valid
var $form = $(this.form);
if (!$form.valid())
    return;

gdzie próbujesz zapisać formularz.

Zapisałem formularz przez połączenie Ajax.

Mam nadzieję, że to komuś pomoże.


1
Ten jest dla mnie przepracowany. Szukałem rozwiązania od wielu dni, działa w asp.net core 2. Dzięki.
— Pradip Rupareliya

0

po prostu skopiuj ten kod ponownie na końcu kodu modalnego

    <script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>

;)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.