CustomValidator per controllo esistenza e-mail

martedì 04 marzo 2008 - 16.44

ely_bise Profilo | Newbie

Ciao a tutti!
Sono disperata: da pochissimo ho deciso di iniziare ad usare il control toolkit ajax e sto cercando di usare il ValidatorCalloutExtender.
Per controlli normali tutto apposto, funziona, ma per il CustomValidator ho un problema:
Il mio CustomValidator mi serve per eseguire un controllo sul database dell'esistenza della mail inserita dall'utente, così ho aggiunto la funzione lato server per la verifica e fin qui ok, il problema è che dovrei metterla anche lato client (con una funzione javascript) per fare in modo che funzioni correttamente il ValidatorCalloutExtender, ma non ho idea di come fare per la select da db in javascript...in teoria non si può fare... ma non è che ci sono alternative? come posso risolvere questo problema?
Spero tanto che qualcuno possa aiutarmi!!! grazie in anticipo!

<asp:TextBox MaxLength="100" runat="server" ID="TxtEmail" CssClass="contorno" />
<asp:RequiredFieldValidator runat="server" id="RfvEmail" ValidationGroup="OkApp" ControlToValidate="TxtEmail" ErrorMessage="Attenzione! Campo obbligatorio." Text="Attenzione! Campo obbligatorio."
display="None" cssclass="arancio" />
<asp:CustomValidator ID="CvEmail" runat="server" OnServerValidate="CvEmail_ServerValidate" Display="None"
ErrorMessage="L'utente con questa e-mail è già stato inserito." Text="L'utente con questa e-mail è già stato inserito." ValidationGroup="OkApp">
</asp:CustomValidator>
<ajaxToolkit:ValidatorCalloutExtender runat="Server" ID="AjRfvEmail"
TargetControlID="RfvEmail"
HighlightCssClass="validatorCalloutHighlight" />
<ajaxToolkit:ValidatorCalloutExtender runat="Server" ID="AjCvEmail"
TargetControlID="CvEmail"
HighlightCssClass="validatorCalloutHighlight" />


protected void CvEmail_ServerValidate(object source, ServerValidateEventArgs arguments)
{
bool corretto = true;
SqlConnection cnn = null;
SqlCommand cmd = null;
string StrSql;
string Username = TxtEmail.Text.Trim();

cnn = new SqlConnection();
cnn.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnDB"].ConnectionString;
cnn.Open();

// verifica se esiste già un utente con quella mail
StrSql = "select per verifica esistenza";
cmd = new SqlCommand(StrSql, cnn);
SqlDataReader sdr = cmd.ExecuteReader();

if (sdr.Read())
{
// e-mail già utilizzata
corretto = false;
}

sdr.Close();
cnn.Close();

arguments.IsValid = corretto;
}

pozzoli.samuele Profilo | Senior Member

>Ciao a tutti!
>Sono disperata: da pochissimo ho deciso di iniziare ad usare
>il control toolkit ajax e sto cercando di usare il ValidatorCalloutExtender.
>Per controlli normali tutto apposto, funziona, ma per il CustomValidator
>ho un problema:
>Il mio CustomValidator mi serve per eseguire un controllo sul
>database dell'esistenza della mail inserita dall'utente, così
>ho aggiunto la funzione lato server per la verifica e fin qui
>ok, il problema è che dovrei metterla anche lato client (con
>una funzione javascript) per fare in modo che funzioni correttamente
>il ValidatorCalloutExtender, ma non ho idea di come fare per
>la select da db in javascript...in teoria non si può fare...
>ma non è che ci sono alternative? come posso risolvere questo
>problema?
>Spero tanto che qualcuno possa aiutarmi!!! grazie in anticipo!

Il codice... non lo guardo.

Capito il problema.

Io, fossi in te, proverei a fare un web-service che fa il controllo (il codice lo hai già, quindi ci metti 10 secondi). A quel punto fai una chiamata javascript tramite httprequest al webservice, che ti risponde con una sola parola si o no.

Controlli il risultato della risposta e agisci di conseguenza.

Non è difficile, l'ho già fatto molte volte...

L'unica cosa da cui ti metto in guardia è che se un piccione qualsiasi disattiva javascript, il tuo controllo va in jamaica! Ocio, quindi... non ti affidare solo a javascript.

ely_bise Profilo | Newbie

Ciao! Scusa il ritardo, ma ho fatto un pò di prove!
Allora il web service ho trovato come farlo, testato e funziona. Ho creato una Dll con dentro un metodo che mi restituisce true o false in base se esiste l'email inserita! :)
Ora però non ho capito bene come chiamare il tutto da javascript...avresti un esempio chiaro?

Grazie mille

pozzoli.samuele Profilo | Senior Member

Perfetto! Così hai imparato perfettamente quest'arte! Sono molto comodi. Imamgina solo, ad esempio, ad un login centralizzato! Carino, no?

Questo il codice che fa un httprequest e legge la risposta.

Vediamo se riesci a combinare qualcosa o ti serve altro...

****____****

function Funzione()
{


var strURL = 'Indirizzo della pagina, compreso di http:// iniziale (Ovviemente puoi passare dei parametri. Leggendoli direttamente dai campi, magari, con javascript)';

// create a new parser object instance
var objHTTP = new ActiveXObject("microsoft.XMLHTTP");

objHTTP.open('POST',strURL , false);

// and send the request to the server
objHTTP.send(doc);

//risultato.innerText= objHTTP.responseText;
x=objHTTP.responseText;

if (x =='Risultato positivo')
window.navigate("PaginaOk.aspx");
else
risultato.innerHTML =x;

}

</SCRIPT>

var strURL = 'Indirizzo della pagina, compreso di http:// iniziale';

var objHTTP = new ActiveXObject("microsoft.XMLHTTP");

objHTTP.open('GET',strURL , false);

objHTTP.send();


stringa=objHTTP.responseText

****____****

In stringa, ti ritrovi il testo ritornato dal webservice.

Ti cosiglio quindi di fare un response.clear e un return. In questo modo, hai in uscita solo il codice necessario.

Se hai problemi, fammi sapere!

ely_bise Profilo | Newbie

Ciao!! Eccomi qua!
Sto provando ora ad implementare la parte di javascript in questo modo per vedere se intanto si blocca l'esecuzione e comunica l'errore:

<script type="text/javascript" language="javascript">
function ControllaMail(source, args){
args.isValid = false;
}
</script>

legato poi ad un castomvalidator:
<asp:CustomValidator ID="CvEmail" runat="server" OnServerValidate="CvEmail_ServerValidate" Display="None" ClientValidationFunction="ControllaMail"
ErrorMessage="L'utente con questa e-mail è già stato inserito." Text="L'utente con questa e-mail è già stato inserito." ValidationGroup="OkApp">
</asp:CustomValidator>

Mi da però errore: Eccezione di protezione, così ho cambiato il web.config e messo così:
<securityPolicy>
<trustLevel name="Full" policyFile="internal" />
<trustLevel name="High" policyFile="web_hightrust.config" />
<trustLevel name="Medium" policyFile="web_mediumtrust.config" />
<trustLevel name="Low" policyFile="web_lowtrust.config" />
<trustLevel name="Minimal" policyFile="web_minimaltrust.config"/>
</securityPolicy>
<trust
level="Full"
originUrl=""
processRequestInApplicationTrust="true" />

ma non funziona ancora... Ti è già capitato questo errore?
Poi volevo chiederti un'altra cosa: non ho capito bene i meccanismi dall'esempio che mi hai mandato...io non devo passare da nessuna parte il nome della dll e il metodo da invocare lato javascript? come può funzionare?
Sono proprio out su questo argomento...sigh!!!
grazie mille intanto della disponibilità e dell'aiuto, davvero gentile!!!

pozzoli.samuele Profilo | Senior Member

>Ciao!! Eccomi qua!
>Sto provando ora ad implementare la parte di javascript in questo
>modo per vedere se intanto si blocca l'esecuzione e comunica
>l'errore:
>
> <script type="text/javascript" language="javascript">
> function ControllaMail(source, args){
> args.isValid = false;
> }
> </script>
>
>legato poi ad un castomvalidator:
><asp:CustomValidator ID="CvEmail" runat="server" OnServerValidate="CvEmail_ServerValidate"
>Display="None" ClientValidationFunction="ControllaMail"
>ErrorMessage="L'utente con questa e-mail è già stato inserito."
>Text="L'utente con questa e-mail è già stato inserito." ValidationGroup="OkApp">
> </asp:CustomValidator>


Quindi, fino a qui, non ci sono problemi, giusto?


>Mi da però errore: Eccezione di protezione,

Aspè, aspè... Eccezione di protezione?!?!? Strano! Se funzionava prima...Non fai nessuna cosa pericolosa!

> così ho cambiato
>il web.config e messo così:
> <securityPolicy>
> <trustLevel name="Full" policyFile="internal" />
><trustLevel name="High" policyFile="web_hightrust.config"
>/>
><trustLevel name="Medium" policyFile="web_mediumtrust.config"
>/>
><trustLevel name="Low" policyFile="web_lowtrust.config" />
><trustLevel name="Minimal" policyFile="web_minimaltrust.config"/>
> </securityPolicy>
> <trust
> level="Full"
> originUrl=""
> processRequestInApplicationTrust="true" />
>
>ma non funziona ancora... Ti è già capitato questo errore?

Sinceramente mai! Mi spiace!

>Poi volevo chiederti un'altra cosa: non ho capito bene i meccanismi
>dall'esempio che mi hai mandato...io non devo passare da nessuna
>parte il nome della dll e il metodo da invocare lato javascript?

Direi che, semplicemente, tu fai una richiesta ad un pagina.

Il webservice, lo puoi invocare tramite url.

E' l'url, il riferimento alla dll e ai parametri da passare!

>come può funzionare?

(Risposto poco sopra... )

>Sono proprio out su questo argomento...sigh!!!

Guarda, la prima volta che ci ho sbattuto il naso (aka: me l'hanno chiesto per lavoro) e sapevo già comportarmi abbastanza bene con i webservice, ci ho messo 3 giorni!

>grazie mille intanto della disponibilità e dell'aiuto, davvero
>gentile!!!

E tu una perfetta corrispondente! Davvero! Complimentoni per come affronti i problemi! BRAVISSIMA!

Altri richiedono codice pronto e magari nel proprio linguaggio di sviluppo perchè altrimenti tradurlo si fa fatica...

Dicevamo quidi, riassumendo:
1- Mi spiace. Errori di protezione non me ne sono capitati. Non saprei proprio come aiutarti. Di solito login e memorizzazione profili etc etc, siccome mi servono cose strane, me li faccio a manina, usando le session.
2- Per richiamare la dll, richiami un url. L'url può essere di una pagina aspx che richiama il webservice, se sei più commoda, o direttamente il webservice:
3- I parametri (ad es l'e-mail) li passi come parametri della querystring.

Faccio una veloce ricerca su come passare i parametri direttamente al webservice (adesso non l'ho perfettamente presente) e ti rispondo!

Buonissima giornata e buon lavoro!

pozzoli.samuele Profilo | Senior Member

Eccolo qua...

Articolo della concorrenza, ma pare molto ben fatto.

Una guida molto completa su come funziona.

Anche senza l'http request, che magari è meglio...

Dimenticato il link... Sob...
http://www.guru4.net/articoli/webservice-introduzione/

Mi sono accorto però, che lo fa con codice lato server. Quindi dovresti passare da una paginetta di appoggio, molto rapida da fare, che prendere i / il parametro da querystring e chiama il servizio. (mi pare proprio di aver fatto così, quella volta!)

Poi, ottenuto il response dal servizio, compili la risposta facendo:

response.clear
response.write(risposta)
response.end

Questo ti fa tornare solo la risposta al client!

Tienimi aggiornato!

ely_bise Profilo | Newbie

Ciao di nuovo!
L'articolo l'avevo trovato anch'io per fare il web service, molto utile!
Ce l'ho fattaaaa!!!
Grazie mille...sono contentissima, ora spero di non avere intoppi nel spostare il progetto!!!
Una sudata comunque:
- il problema dell'eccezione l'ho risolto spostando il progetto in locale ed eseguendolo da locale...poi vedremo quando pubblico come va...
- per quanto riguarda la funzione javascript non mi andava nemmeno prima nella versione semplice che restituiva solo la validazione negata, ho dovuto sostituirla con una equivalente in vbscript...(e qua vorrei dire che la cosa mi sembra assurda...spero funzioni per tutti i browser...)
- venendo invece al meccanismo di interazione web service e vbscript ho dovuto passare per forza per una pagina aspx che al load chiamasse il metodo per la verifica della mail e restituisse al client la risposta, proprio come dicevi tu

protected void Page_Load(object sender, EventArgs e)
{
testmail verifica = new testmail();
string email = Convert.ToString(Request.QueryString["email"]);
bool emailgiainserita = verifica.EsistenzaMail(email);

Response.Clear();
Response.Write(emailgiainserita);
Response.End();
}

avevo provato anche ad usare direttamente vbscript senza passare per una pagina aspx, ma non mi va proprio, peccato, sia in get che in post, avevo scritto così:

Sub CvEmail_ClientValidate(source, arguments)
dim strURL
dim stringa
dim email
email=arguments.Value
strURL = "http://localhost:3613/devgiardini_locale/webservice/testmail.asmx/EsistenzaMail?email=" & email
set objHTTP = CreateObject("microsoft.XMLHTTP")
objHTTP.open "GET", strURL, false
objHTTP.send
stringa=objHTTP.responseText

msgbox stringa
arguments.IsValid=false
End Sub

In conclusione ecco la funzione funzionante sotto vbscript:

<script language="vbscript">

<!--

Sub CvEmail_ClientValidate(source, arguments)
dim strURL
dim stringa
dim email
email=arguments.Value
strURL = "http://localhost:3613/devgiardini_locale/ChiamataServiceMail.aspx?email=" & email
set objHTTP = CreateObject("microsoft.XMLHTTP")
objHTTP.open "GET", strURL, false
objHTTP.send
stringa=objHTTP.responseText

If stringa="True" Then
arguments.IsValid=false
Else
arguments.IsValid=true
End If
End Sub


' -->

</script>

Grazie ancora per l'aiuto e ho postato il più possibile così magari può essere d'aiuto ad altri!!!
Ciao ciao
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5