2014-07-04 9 views
10

Possiedo un progetto MVC ASP.Net e sto utilizzando la convalida jQuery non invadente. per aggiungere la convalida quando un elemento perde attenzione, sto chiamando

$(document).ready(function() { 
    // enable validation when an input loses focus. 
    var settngs = $.data($('form')[0], 'validator').settings; 
    settngs.onfocusout = function (element) { $(element).valid(); }; 
}); 

Questo sta lavorando su un progetto mentre si genera questa eccezione su un altro progetto, perché $ .data ($ ('forma') [0], ' validatore ') restituisce indefinito ($ .data ($ (' forma ') [0]) restituisce un oggetto vuoto):

Uncaught TypeError: Cannot read property 'settings' of undefined

Tuttavia jQuery convalida sta lavorando bene quando si preme il pulsante di invio, quindi tutto il resto dovrebbe essere impostato correttamente

Sto caricando questi script al termine del tag body: (la funzione di cui sopra è in customvalidations.js quindi dovrebbe eseguire dopo il validatore viene applicato al modulo)

<script src="/Staffing/Scripts/jquery-2.1.1.js"></script> 
<script src="/Staffing/Scripts/globalize/globalize.js"></script> 
<script src="/Staffing/Scripts/globalize/cultures/globalize.culture.de-DE.js"></script> 
<script src="/Staffing/Scripts/bootstrap.js"></script> 
<script src="/Staffing/Scripts/respond.js"></script> 
<script src="/Staffing/Scripts/bootstrap-datepicker.js"></script> 
<script src="/Staffing/Scripts/bootstrap-datepicker-globalize.js"></script> 
<script src="/Staffing/Scripts/locales/bootstrap-datepicker.de.js"></script> 
<script src="/Staffing/Scripts/jquery.unobtrusive-ajax.js"></script> 
<script src="/Staffing/Scripts/jquery.validate.js"></script> 
<script src="/Staffing/Scripts/jquery.validate.globalize.js"></script> 
<script src="/Staffing/Scripts/jquery.validate.unobtrusive.js"></script> 
<script src="/Staffing/Scripts/localization/messages_de.js"></script> 
<script src="/Staffing/Scripts/customvalidations.js"></script> 
<script src="/Staffing/Scripts/uiadditions.js"></script> 
<script src="/Staffing/Scripts/default.js"></script> 

Soluzione: Questo è il codice che funziona:

$(document).ready(function() { 
    // enable validation when an input loses focus. 
    var allForms = $('form'); 
    $.each(allForms, function (key, value) { 
     var val = $.data(value, 'validator'); 
     if (val != undefined) { 
      var settngs = val.settings; 
      settngs.onfocusout = function (element) { $(element).valid(); }; 
     }}); 
}); 

il problema era che i nuovi controlli di convalida del plugin se ci sono elementi presenti che dovrebbero essere convalidati e ho avuto 2 moduli sul SA la mia pagina con il primo modulo che non ha elementi di input convalidati.

risposta

14

Ho appena aggiornato a pacchetto Microsoft.jQuery.Unobtrusive.Validation.3.2.0. Ho incontrato lo stesso problema. È possibile che tu abbia eseguito l'upgrade alla stessa versione?

Se è così, potrei offrire i miei due centesimi :). Dopo un po 'di debug ho notato che la seguente modifica è stata apportata in jquery.validate.unobtrusive.JS:

versione precedente:

var $forms = $(selector) 
     .parents("form") 
     .andSelf() 
     .add($(selector).find("form")) 
     .filter("form"); 

Nuova versione:

 $forms = $selector.parents() 
          .addBack() 
          .filter("form") 
          .add($selector.find("form")) 
          .has("[data-val=true]"); // key point! 

La chiave sembra essere: il has("[data-val=true]"). Cioè, se il tuo modulo non ha discendenti (come un elemento di input) con quel valore di attributo, non verrà analizzato dal helper di convalida e nessun dato 'validatore' verrà assegnato a quell'elemento di modulo. Otterrai quindi questo errore "indefinito" se proverai ad accedere al validatore di quel modulo in una fase successiva.

Nel mio caso, le forme per le quali ciò stava accadendo non utilizzavano effettivamente alcuna convalida, quindi non avevano questo attributo. Sono stato quindi in grado di modificare la logica del validatore personalizzato per verificare innanzitutto se il validatore esiste prima di modificare le impostazioni del validatore.

Spero che questo aiuti.

+0

Questa è stata la causa. Vedi la mia domanda modificata per il codice che funziona. – wertzui

+0

Solo wow. Noi co-optiamo per un controllo dinamico senza ostriche: letteralmente impostando solo un contenitore div da qualche parte sotto il modulo, abbiamo ripristinato tutte le nostre convalide interrotte. Questo è stato difficile da trovare, e questa risposta è stata molto utile. Grazie. – twip

0

Verificare prima il numero di moduli, penso che si stia utilizzando un modulo errato.

$(document).ready(function() { 
// enable validation when an input loses focus. 
    if($('form').length > 0) { 
    // $('form')[0] is it proper form? 
    var settngs = $.data($('form')[0], 'validator').settings; 
    settngs.onfocusout = function (element) { $(element).valid(); }; 
    } 
}); 
+0

$ ('forma'). Length> 0 restituisce true (c'è un modulo nella pagina) – wertzui

1

Sembra che i vostri progetti utilizzano diversi tipi di validadion (Uno di loro usano di default l'uso discreto e secondo).

Controllare se si stanno utilizzando le impostazioni successive in web.config di entrambi i progetti.:

<configuration>  
    <appSettings>   
    <add key="ClientValidationEnabled" value="true"/>   
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/>  
    </appSettings> 
</configuration> 

Inoltre si sta cercando di lavorare con prima forma nel documento.

Nel caso in assenza di moduli, verrà visualizzato l'errore.

Nel caso quando ci sono più di un modulo - solo il primo modulo utilizzerà il focusout per la convalida.

Così si dovrebbe fare stessa cosa per ogni modulo:

$(document).ready(function() { 
    var $forms = $('form'); 
    $.each($forms, function (key, value) { 
     // enable validation when an input loses focus. 
     var settings = $.data(value, 'validator').settings; 
     settings.onfocusout = function (element) { $(element).valid(); }; 
    }); 
}); 
2

Questo può accadere anche non hai chiamato validate() sul modulo come tale:

$("#your_form").validate(); 

Nel mio caso, ho avuto nessuna forma con l'id "your_form" sulla mia pagina di conseguenza causare questo errore durante il tentativo di aggiungere regole.

+1

Ha funzionato per me quando aggiungo dinamicamente un modulo tramite ajax – Erresen

0

Facendo questo $.validator.unobtrusive.parse($("#base-modal form")); risolto il mio problema

Problemi correlati