convalida discreta che non funziona con contenuti dinamici


96

Ho problemi nel tentativo di far funzionare la convalida jquery discreta con una vista parziale caricata dinamicamente tramite una chiamata AJAX.

Ho passato giorni a cercare di far funzionare questo codice senza fortuna.

Ecco la vista:

@model MvcApplication2.Models.test

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

La vista parziale:

@model MvcApplication2.Models.test

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

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

Il modello:

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

Il controller:

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

e infine, il 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;
    }
});

La convalida non funziona. Anche se non inserisco nessuna informazione nel texbox, l'evento submit mostra l'avviso ('valid').

Tuttavia, se invece di caricare dinamicamente la vista, utilizzo @Html.Partial("test", Model)per eseguire il rendering della vista parziale nella vista principale (e non eseguo la chiamata AJAX), la convalida funziona perfettamente.

Ciò è probabilmente dovuto al fatto che se carico dinamicamente il contenuto, i controlli non esistono ancora nel DOM. Ma faccio una chiamata a $.validator.unobtrusive.parse($("#res")); cui dovrebbe essere sufficiente per far conoscere al validatore i controlli appena caricati ...

Qualcuno può aiutare?


Ho avuto anche lo stesso problema, ma in mvc 2. Passo passo dopo passo come: weblogs.asp.net/imranbaloch/archive/2010/07/11/… Anche questo potrebbe aiutarti. weblogs.asp.net/imranbaloch/archive/2011/03/05/… Spero che questo aiuto :)
Naresh Parmar

2
Nota, la unobtrusive.parsefunzione accetta un selettore come argomento, non un elemento.
Fred

Risposte:


226

Se provi ad analizzare un modulo che è già stato analizzato, non verrà aggiornato

Quello che potresti fare quando aggiungi un elemento dinamico al modulo è l'uno o l'altro

  1. Puoi rimuovere la convalida del modulo e convalidarlo nuovamente in questo modo:

    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. Accedi ai unobtrusiveValidationdati del modulo utilizzando il datametodo jquery :

    $(form).data('unobtrusiveValidation')

    quindi accedi alla raccolta di regole e aggiungi i nuovi attributi degli elementi (che è un po 'complicato).

Puoi anche consultare questo articolo sull'applicazione della convalida jquery discreta a contenuto dinamico in ASP.Net MVC per un plug-in utilizzato per aggiungere elementi dinamici a un modulo. Questo plugin utilizza la seconda soluzione.


17
Amico, rock, mi hai salvato totalmente la giornata! Risposta fantastica!
Dimitar Dimitrov

Avevo paura di invitarlo da solo. Lo script di quella pagina funziona come un incantesimo.
cezarypiatek

Codice, funziona alla grande - aggiornamento rapido (se posso) 1. Sto usando knockout e ricevendo i nomi dei campi sembra un problema. $ .validator.unobtrusive.parseDynamicContent ('form'); (per ottenere tutti i campi), alla fine durante l'invio. 2. Questo è carino johnnyreilly.github.io/jQuery.Validation.Unobtrusive.Native/… per darti un modo per nominare i campi (che sembra essere richiesto? Sto usando jquery non invadente bootstrap sopra gli altri 2 quindi il mio le circostanze sono probabilmente diverse)
Richard Housham

Solo una nota che qualsiasi impostazione specifica del modulo a cui hai applicato $("form").data("validator").settingsverrà rimossa $(formSelector).removeData("validator")e sostituita con i valori predefiniti $.validator.defaultsdurante il riesecuzione del modulo. Questo è un ottimo modo per includere campi dinamici, ma assicurati di ripetere qualsiasi codice di inizializzazione personalizzato a ogni nuova analisi.
KyleMit

19

In aggiunta alla risposta di Nadeem Khedr ...

Se hai caricato dinamicamente un modulo nel tuo DOM e poi chiama

jQuery.validator.unobtrusive.parse(form); 

(con i bit extra menzionati) e quindi invierà quel modulo usando ajax ricordati di chiamare

$(form).valid()

che restituisce vero o falso (ed esegue la convalida effettiva) prima di inviare il modulo.


ciao, sto affrontando lo stesso problema. sto mostrando la mia vista dinamica in un pop-up (finestra di dialogo jquery). le convalide discrete non funzionano. dove chiamo $ (form) .valid () nella mia visualizzazione dinamica o da qualche altra parte?
mmssaann

Ho sempre impedito l'invio del modulo restituendo false all'interno di $ (form) .submit perché stavo facendo un invio AJAX, ma poi avevo bisogno di un modo per non chiamare l'invio AJAX quando la convalida non è riuscita. $ (form) .valid () è la risposta! Grazie!
jgerman

6

aggiungilo al tuo _Layout.cshtml

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

3
Ciò è particolarmente inefficiente.
Liam

5

Sorprendentemente, quando ho visualizzato questa domanda, i documenti ufficiali di ASP.NET non avevano ancora alcuna informazione sul parse()metodo discreto o su come usarlo con contenuto dinamico. Mi sono preso la libertà di creare un problema nel repository della documentazione (facendo riferimento alla risposta originale di @ Nadeem) e di inviare una richiesta pull per risolverlo. Queste informazioni sono ora visibili nella sezione di convalida lato client dell'argomento di convalida del modello.


3

prova questo:

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

2

Sono stato colpito dallo stesso problema e niente ha funzionato tranne questo:

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

e aggiungi

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

dove stai cercando di salvare il modulo.

Stavo salvando il modulo tramite una chiamata Ajax.

Spero che questo possa aiutare qualcuno.


1
Questo è funzionato per me. Stavo trovando una soluzione negli ultimi giorni, funziona in asp.net core 2. Grazie.
Pradip Rupareliya

0

basta copiare di nuovo questo codice alla fine del codice modale

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

;)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.