31 messaggi dal 20 agosto 2018
Ciao a tutti, tra i controlli di un form c'è anche il controllo dell'esistenza nel database della mail, nome cognome telefono e user. I controlli semplici come campo vuoto o formato mail sono fatti in javascript, ma quelli dell'esistenza in asp, e quindi ogni volta che l'utente compila il form non saprà mai se la sua mail il suo user o il suo nome sono già stati usati, volevo risolvere questo problema inserendo una funzione nel ciclo if else in javascript, che controlla la corretta compilazione dei campi sopra descritti, una funzione ajax che a sua volta richiama la funzione asp che controlla l'esistenza o meno del nome, telefono ecc.ecc.
Se è possibile, come richiamo la funzione con ajax??
Spero di essere stato abbastanza chiaro.
Saluti MAX
11.868 messaggi dal 09 febbraio 2002
Contributi
Ciao Max,


Se è possibile, come richiamo la funzione con ajax??

Dipende, ci sono vari modi per inviare una richiesta ajax. Se stai usando jQuery potrebbe tornarti utile il suo metodo ajax.
http://api.jquery.com/jquery.ajax/

Altrimenti puoi usare l'oggetto XMLHttpRequest oppure la nuova API fetch.


inserendo una funzione nel ciclo if else in javascript

Ok, puoi chiamare una tua pagina .asp con ajax però devi tenere presente che questa chiamata sarà asincrona. Cioè, non puoi metterla in un if come faresti per la validazione dell'obbligatorietà di un campo.

Questo può andar bene:
if (camponome.value.length == 0) {
  alert("Il campo 'nome' è vuoto!"); 
}


Ma quando è coinvolta una richiesta ajax no. NON puoi fare questo:
if ($.ajax('tuapagina.asp')) {
  //...
}

Non lo puoi fare perché la funzione $.ajax non restituisce i dati ottenuti dalla pagina asp, ma restituisce un oggetto che rappresenta un'operazione asincrona, cioè che si completerà fra un certo lasso di tempo, cioè quando il server restituirà una risposta.

Comunque, intanto prova a inviare la richiesta ajax e poi vediamo che tecniche esistono per inibire il submit del form finché le richieste ajax non si sono concluse.

ciao,
Moreno
Modificato da BrightSoul il 26 aprile 2019 12:24 -

Enjoy learning and just keep making
31 messaggi dal 20 agosto 2018
Ciao Moreno, grazie per la tua risposta esaustiva, si utilizzo jquery.
Ho provato a buttare giù qualche riga di codice:
dal tasto submit del form viene richiamata una funzione js tramite onclick="return controllo()" questa funzione controllo contiene i controlli di tutti i campi del form, ho iniziato con il nome:
if(accedi.nome.value == ""){
    document.getElementById('nome').setAttribute("class","error");
    document.getElementById('errore').style.display = "block";
    document.getElementById('errore').innerHTML = "Devi inserire un nome.";
    accedi.nome.focus();
    return false;
  }
  else if(accedi.nome.value.length < 3 || validanome(accedi.nome.value)){//... qui viene richiamata la funzione validanome che contiene la chamata ajax.
    document.getElementById('nome').setAttribute("class","error");
    document.getElementById('errore').style.display = "block";
    document.getElementById('errore').innerHTML = "Devi inserire un nome valido.";
    accedi.nome.focus();
    return false;
  }
  else{
    document.getElementById('nome').removeAttribute("class");
    document.getElementById('errore').style.display = "hidden";
  }

la funzione validanome è contenuta in un altro file funzioni.js
function validanome (nome) {
    $.ajax({
        type: "POST",
        url: "/funzioni/funzioni.asp",
        data: {
                nome: nome
            }
        });
}

Fatto questo alla pagina funzioni .asp c'è una funzione specifica che verifica l'esistenza del nome nel db, come faccio a richiamare solo quella??
Grazie, max
Modificato da Maxvilander il 26 aprile 2019 12:51 -
11.868 messaggi dal 09 febbraio 2002
Contributi
Ciao,


Fatto questo alla pagina funzioni .asp c'è una funzione specifica che verifica l'esistenza del nome nel db, come faccio a richiamare solo quella??

Non inviare la richiesta ajax a funzioni.asp. Predisponi invece un'altra pagina asp che:
  • Include funzioni.asp
  • Legge il nome con Request.Form("nome")
  • Invoca una funzione definita in funzioni.asp
  • Restituisce un risultato per indicare al client se il nome esisteva oppure no.


Ecco un esempio di tale pagina. Supponiamo che si chiami verificaNome.asp
<!--#include file="funzioni/funzioni.asp"-->
Dim nome
nome = Request.Form("nome")
Dim esiste
'Qui chiamo la funzione definita in funzioni.asp
esiste = verificaSeNomeEsiste(nome)
'Restituisco un risultato per il client
If esiste Then
  Response.Write "1"
Else
  Response.Write "0"
End If



dal tasto submit del form viene richiamata una funzione js tramite onclick="return controllo()"

Non va bene, perché il return controllo() funzionerà solo se fai verifiche sincrone. Qui invece sono coinvolte anche delle verifiche asincrone dato che stai inviando richieste ajax.
Come ti dicevo nel post precedente non è il caso di invocare la funzione validanome come parte della condizione dell'if. Lei produrrà un risultato in maniera asincrona, perciò non valutabile in maniera sincrona nell'if.
else if(accedi.nome.value.length < 3 || validanome(accedi.nome.value)){


Quindi il bottone non dovrà essere un submit ma dovrà avere l'attributo type="button". E all'onclick esegui la funzione controllo(). Ad esempio:
<input type="button" onclick="controllo(this.form)" value="Invia il form" />


Dalla funzione controllo dovrai invocare il submit del form solo se tutte le verifiche sono state fatte con successo. Esempio (scrivo a braccio, non è detto che sia corretto).
function controllo(form) {
  if(accedi.nome.value == ""){
    document.getElementById('nome').setAttribute("class","error");
    document.getElementById('errore').style.display = "block";
    document.getElementById('errore').innerHTML = "Devi inserire un nome.";
    accedi.nome.focus();
    return; //Ora basta fare return
  }
  else if(accedi.nome.value.length < 3){ 
    document.getElementById('nome').setAttribute("class","error");
    document.getElementById('errore').style.display = "block";
    document.getElementById('errore').innerHTML = "Devi inserire un nome valido.";
    accedi.nome.focus();
    return;
  }
  else{
    document.getElementById('nome').removeAttribute("class");
    document.getElementById('errore').style.display = "hidden";
  }

  //Se tutti i controlli sincroni sono andati a buon fine, allora eseguo la richiesta ajax di validazione.
  validanome(form, accedi.nome.value);
}


La funzione validanome dovrà essere modificata in questo modo per invocare il submit del form se e quando la pagina asp ci dice che il nome non esiste. Ancora una volta, scrivo a braccio quindi ci saranno degli errori. Cerca di cogliere l'intento di quello che sto facendo qui.

function validanome (form, nome) {
    $.ajax({
        type: "POST",
        url: "/verificaNome.asp",
        data: {
                nome: nome
            }
        },
        success: function(risultato) { //questa callback viene eseguita quando la richiesta ajax è completa
          if (risultato != "0") { //Risultato è il testo restituito dalla pagina asp
             //Stampo l'errore
                 document.getElementById('nome').setAttribute("class","error");
                 document.getElementById('errore').style.display = "block";
                 document.getElementById('errore').innerHTML = "Il nome esisteva";
          } else {
             //il nome non esisteva, quindi posso inviare il form
             form.submit();
          }
        });
}


Ciao,
Moreno

P.S. Ricordati di fare gli stessi controlli anche lato server prima di creare l'utente. Infatti, la validazione JavaScript è facilmente bypassabile dagli smanettoni.
Modificato da BrightSoul il 26 aprile 2019 13:41 -

Enjoy learning and just keep making
31 messaggi dal 20 agosto 2018
Ciao Moreno, grazie per le tue dritte, sono riuscito a costruire lo script per il controllo con successo.
Saluti Max
11.868 messaggi dal 09 febbraio 2002
Contributi
Ok, perfetto

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.