944 messaggi dal 11 febbraio 2013
ciao
sto cercando di evitare che l'utente possa fare il submit di un form
se l'indirizzo email non è valido (uso mailboxlayer.com)

function isValidEmail(email) {
    return $.ajax({
        url: 'http://apilayer.net/api/check?access_key=' + access_key + '&email=' + email,
        dataType: 'jsonp'
    });
}

function validateFieldEmail(email, event) { 
    isValidEmail(email).done(function(json) {
        //console.log('json ' + json);
        if (json.format_valid  && json.smtp_check  && json.mx_found )
            {
            emailFeedBack.text("");
            $("#Email").removeClass("validationNotOk").addClass("validationOk");

            } else {
            event.preventDefault();
            alert('Email non valida. ');
            emailFeedBack.text("Per favore inserisci un indirizzo email valido. ");
            $("#Email").removeClass("validationOk").addClass("validationNotOk");
        }
    }).fail(function() {
        alert("Si è verificato un errore. Sarai reindirizzato all'home per riprovare !");
       
    });
}


ho provato con un indirizzo che non rispetta i criteri ma non riesco ad impedire
con event.preventDefault il submit...al vero non compare nemmeno l'alert

cosa sbaglio?
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
per inibire il submit devi restituire false in maniera sincrona. Ecco un esempio:

<form onsubmit="return validaForm();">
<button>Invia il form</button>
</form>
<script>
function validaForm() {
  //Funziona perché return false non è dentro una callback di una richiesta ajax
  return false;
};
</script>

Ecco il fiddle: https://jsfiddle.net/4dv21q9b/

Puoi usare anche preventDefault, ma anch'esso dev'essere invocato in maniera sincrona, come vedi qui.
https://jsfiddle.net/4dv21q9b/4/

Il problema del tuo codice è che stai invocando preventDefault dalla callback di una richiesta ajax, quando ormai il submit si è già risolto.

Secondo me dovresti spostare la verifica dell'email lato server, perché tanto dovresti farla comunque questa verifica. La validazione lato client non può essere l'unica perché un visitatore la può scavalcare facilmente alterando il codice HTML e javascript della pagina.

Comunque, inviare il submit solo dopo che una richiesta ajax si è risolta è possibile.
  • All'onclick sul button invii la richiesta ajax;
  • Quando la richiesta ajax si risolve, invochi il metodo submit del form.


Ecco una dimostrazione in questo fiddle:
https://jsfiddle.net/4dv21q9b/12/

ciao,
Moreno

Enjoy learning and just keep making
944 messaggi dal 11 febbraio 2013
ok capito

cmq lato server ho messo dataannotation a decorare il campo.
Intendi qualcos'altro ?
11.886 messaggi dal 09 febbraio 2002
Contributi
No, intendevo dire che questa richiesta che tu fai lato client con jquery:
return $.ajax({
        url: 'http://apilayer.net/api/check?access_key=' + access_key + '&email=' + email,
        dataType: 'jsonp'
    });


La dovresti invece fare lato server in C# con HttpClient.

Se la tieni lato client come ora, stai pure divulgando la tua access_key e invece andrebbe tenuta segreta. Motivo in più per fare la validazione lato server.


ho messo dataannotation a decorare il campo.

Ok, questo va bene per fare un controllo sintattico e dovresti mantenere le data annotation che hai messo. Ad esempio, con [Required] imponi che il campo email non sia vuoto, e con [EmailAddress] imponi che abbia la forma di un indirizzo e-mail. Però dato che a te questi controlli non sono sufficienti perché vuoi anche controllare l'esistenza della casella, devi anche fare a mano una richiesta a mailboxlayer usando HttpClient, lato server, in C#. Quindi, nell'action che riceve i dati del post metti:
//Prima verifico se il dto è conforme alle data annotation
if (!ModelState.IsValid) {
  return View(dto);
}
//E qui fai la chiamata con HttpClient per verificare la mail
//Solo se la verifica ha successo, allora salvo i dati


ciao,
Moreno
Modificato da BrightSoul il 12 giugno 2018 21.20 -
Modificato da BrightSoul il 12 giugno 2018 21.20 -

Enjoy learning and just keep making
944 messaggi dal 11 febbraio 2013
Mai fatto...meglio !!!

Grazie grazie

Ciao
944 messaggi dal 11 febbraio 2013
Ciao Moreno
ho fatto come dici
solo ho qualche problema con il codice asincrono...(anche in js...sto imparLando)

[HttpPost]
        public async Task<ActionResult> Create(
            Consumatore consumatore)
        {
            
        
            //check mailboxlayer (smpt,format,found)
            var chekcEmail = CheckEmailAsync(consumatore).Result;
            if (!chekcEmail)
                return View("NotValidMail");
            
           if (ModelState.IsValid)
            {
                ...

                _context.SaveChanges();
                
                await SendEmail(consumatore.Email, consumatore.Nome, distinzione, consumatore);
                return RedirectToAction("Success");
            }

            return View("Create");
        }

public async Task<bool> CheckEmailAsync(Consumatore consumatore)
        {
            using (var client = new HttpClient())
            {
                string access_key = "xxxxxx"; 
                client.BaseAddress = new Uri("http://apilayer.net/");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                HttpResponseMessage response =
                    await client.GetAsync("api/check?access_key=" + access_key + "&email=" + consumatore.Email);
                if (response.IsSuccessStatusCode)
                {
                    Mailboxlayer mail = await response.Content.ReadAsAsync<Mailboxlayer>();

                    if (mail.Smtp_check && mail.Format_valid && mail.Mx_found)
                        return true;
                    else
                        return false;
                }
                else
                {
                    return false;
                }
            }
        }



quando arriva a fare la GET in asincrono (await client.GetAsync) il form si "blocca" ...
Modificato da jjchuck il 13 giugno 2018 12.17 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Ok, questo succede perché stai usando un metodo asincrono (CheckEmailAsync) in maniera sincrona.
Cambia questo:
var chekcEmail = CheckEmailAsync(consumatore).Result;

Così:
var checkEmail = await CheckEmailAsync(consumatore);


Del resto anche sotto avevi usato await, perché qui invece hai usato .Result?
Se vuoi approfondire le cause del blocco che hai riscontrato (che si chiama deadlock), qui trovi delle spiegazioni.
https://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

ciao,
Moreno

Enjoy learning and just keep making
944 messaggi dal 11 febbraio 2013
Perchè sono uno sciocco ...avevo frainteso Result
pensavo che facesse come Wait()

sto facendo troppe cose ... forse date le mie capacità debbo allentare :)

ciao
grazie

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.