2011-07-08 8 views
6

Descrizione generale:
Nella mia forma, ho un campo che richiede la convalida remota. Nella chiamata remota, invio il valore dell'elemento modulo e anche i valori di un paio di altri elementi del modulo su cui questo elemento può dipendere (utilizzato sul server per la convalida).validazione jquery remota: verifica se i dati sono in campo o non

La convalida remota, quando chiamata, funziona alla grande. Il problema è che la convalida remota viene chiamata solo quando c'è un valore nell'elemento modulo. A seconda dei parametri inviati alla convalida remota, questo elemento del modulo potrebbe essere richiesto o potrebbero esserci altri problemi di convalida.

Come posso forzare la convalida remota su questo campo se contiene o meno dati?

scenario specifico:
Hai una lista di ruoli, e un input di testo codice di addetto alle vendite.
Logica lato server: (1) se è selezionato il ruolo del venditore, è necessaria la chat vendite; (2) se il ruolo del venditore non è selezionato, il parametro salespersoncode deve essere vuoto.

Nota che ho altri valori di elemento di modulo che invio al server e c'è altra logica lato server che non ho incluso qui per brevità poiché non aggiungono valore a questa domanda e confondono solo le cose.

<select name="roles" id="roles" multiple="multiple" size="5"></select> 
<input type="text" name="salespersoncode" id="salespersoncode" /> 

$("#add_user_form").validate({ 
    rules: { 
    salespersoncode: { 
     remote: { 
     type: "post", 
     url: "/AdminJson/CheckSalespersonCode", 
     dataType: "json", 
     data: { 
      salespersoncode: function() { return $("#salespersoncode").val(); }, 
      roles: function() { return $("#roles").val(); } 
     } 
     } 
    } 
    } 
} 

Non voglio mettere l'opzione di convalida "necessaria" perché il campo salespersoncode non è richiesto in tutte le situazioni.

La mia domanda ancora: come posso forzare la convalida remota sul campo salespersoncode se contiene o meno dati?

Grazie in anticipo

risposta

1

Sembra che non si può avere un elemento di forma che ha la convalida remoto senza la convalida anche aver richiesto. Finisce con il risultato di una mancata corrispondenza delle dipendenze.

La prima riga del metodo remoto è il controllo per vedere se è facoltativo. Se è facoltativo, restituisce una mancata corrispondenza delle dipendenze. (opzionale è l'inverso del telecomando)

La soluzione che ho trovato era quella di utilizzare un callback delle dipendenze per la regola "richiesta". Nella funzione per la regola 'required', chiamare una chiamata ajax sincrona per verificare i valori nell'interfaccia utente sul server e restituire true/false.

0

provare a impostare in modo esplicito la salesPersonCode prima:

salespersoncode: { 
    salesPersonCode: ($("#salespersoncode").val().length > 0) ? $("#salespersoncode").val() : "", 
    remote: { 
     type: "post", 
     url: "/AdminJson/CheckSalespersonCode", 
     dataType: "json", 
     data: { 
      salespersoncode: salesPersonCode; }, 
      roles: function() { return $("#roles").val(); } 
     } 
    } 
} 
+0

All'interno della funzione validate(), non vedo come posso creare una variabile locale come mi consiglia. Ho aggiornato la mia domanda per avere più dettagli sul metodo di convalida al suo interno. Ti dispiacerebbe aggiornare la tua risposta per dirmi dove posso mettere la var locale senza che il browser mostri errori js? –

+0

forse provarlo? –

4

Aggiungi questo pezzo di codice prima di chiamare il metodo validate():

$.validator.methods._required = $.validator.methods.required; 
$.validator.methods.required = function(value, element, param) 
{ 
    if ($(element).is('[remote-validator]') && !$(element).hasClass('required')) 
     return true; 
return $.validator.methods._required.call(this, value, element, param); 
} 
+0

Un punto importante qui è che l'elemento deve avere un attributo con il nome remote-validator !! (un attributo senza valore va bene). Se non si desidera aggiungere questo attributo e utilizzare semplicemente la convalida remota _quando viene specificata una regola remota, utilizzare questa condizione 'typeof this.settings.rules [$ (elemento).attr ('name')]! = 'undefined' && typeof this.settings.rules [$ (elemento) .attr ('nome')] .remote! = 'undefined'' invece di '$ (elemento) .is ('[remote-validator]') ' – TheStoryCoder

+0

C'è comunque un punto cruciale! Dovrai rendere la tua chiamata remota asincrona impostando la proprietà/valore 'async: false' sul tuo oggetto' remote' nell'impostazione 'rules'. Altrimenti si avrà un comportamento inaspettato poiché ad es. valid() non attenderà la risposta dal server. – TheStoryCoder

Problemi correlati