2010-05-17 14 views
5

Ho una pagina principale che contiene un controllo di accesso in modo che l'utente possa accedere/uscire da qualsiasi pagina. Tuttavia, un paio di pagine di contenuto richiedono un controllo Recaptcha. Questo causa problemi perché quando provo ad accedere a una pagina che ha il controllo Recaptcha, il sistema si aspetta che io inserisca le parole. Sono a conoscenza della mancanza di gruppi di convalida nel controllo Recaptcha e del fatto che non è possibile avere più moduli su una pagina ASP.NET. C'è un modo per aggirare questo? Un modo "hacky" che posso pensare, è nell'evento "Login", controlla la pagina per un controllo Recaptcha. Se ne esiste uno, disabilitalo, altrimenti continua. Tuttavia, ciò sembra abbastanza inefficiente, specialmente quando ci sono alcune pagine e la maggior parte non avrà un controllo Recaptcha.Recaptcha attivato dal controllo della pagina principale

risposta

3

La soluzione per questo problema è la seguente:

  1. Set ValidationGroup al pulsante Login. Il controllo reCAPTCHA non verrà convalidato quando si fa clic su un pulsante con ValidationGroup impostato su non vuoto.
  2. Nelle pagine che richiedono la convalida reCAPTCHA, mantenere il valore ValidationGroup del pulsante su non vuoto (in caso contrario, i campi di accesso verranno convalidati), ma chiamare RecaptchaControl.Validate() manualmente nella subroutine.

Discussion thread su official reCAPTCHA dev mailing list.

+0

Questo non è corretto. Tristemente il recaptcha non segue il modello di asp.net qui. Il controllo del recaptcha non si preoccupa dei gruppi di validazione. La proprietà IsValid viene valutata ogni volta. All'interno di tale metodo vengono eseguiti solo i seguenti controlli: 'if (Page.IsPostBack && Visible && Enabled &&! This.skipRecaptcha)' Quindi, l'unico modo (in questo caso) di mantenere il ricongiunto dalla convalida, oltre a disabilitarlo o nasconderlo , è impostando la proprietà 'SkipRecaptcha' su true. – ntziolis

+0

Sono stato corretto. Il codice sul lato server non funziona con la soluzione precedente ma il codice lato client lo fa. Ho eseguito una correzione al repository per risolvere questo problema. C'è anche una pagina di test (test/ValidationGroup.aspx) per illustrare l'utilizzo. –

+0

Questo è fantastico! Lo proverò molto presto, grazie per la correzione. – ntziolis

0

Che cosa si dovrebbe fare è la seguente:

<form runat="server"></form> 

deve essere avvolto intorno l'intero contenuto della pagina, nel tuo caso nella pagina master in quanto l'accesso è anche lì.

Da questo punto in poi è possibile rilasciare un controllo di ricapitolazione su qualsiasi pagina che deriva dalla pagina master specificata. Non hai bisogno di un altro tag <form runat="server"></form> ovunque.

È necessario comprendere che il controllo di riconciliazione non è associato a un modulo HTML con pulsante, né a nessun altro pulsante specifico. Ogni volta che la pagina postback il recaptcha imposta il flag Page.IsValid.

Purtroppo recaptcha non segue gli standard ASP.NET utilizzando la convalida attivata combinata con i gruppi di convalida.
Quindi, per evitare che recaptcha venga convalidato ogni volta, è necessario impostare: SkipRecaptcha = true

Ciò causa il recaptcha non convalidare. Quindi ora lo scenario di accesso è coperto. Quando si desidera utilizzare effettivamente la funzionalità recaptcha, è sufficiente impostare SkipRecaptcha = false e chiamare Page.Validate(). Successivamente è possibile continuare come prima con Page.IsValid.

Un approccio più pulito e migliore sarebbe la riscrittura del controllo recaptcha per utilizzare la classe BaseValidator. Ciò consentirebbe di specificare un gruppo di validazione sul controllo recaptcha e il pulsante che invia gli input che si desidera proteggere tramite recaptcha. La pressione del pulsante causerà quindi solo una convalida del gruppo di convalida specificato.
Inoltre, è necessario specificare un gruppo di convalida per il pulsante di accesso o impostare CausesValidation = false. Se non viene impostato alcun gruppo di convalida e il pulsante verrà premuto, tutti i gruppi di convalida verranno convalidati automaticamente.
Questo è comunque abbastanza avanzato, così che anche i ragazzi del recaptcha hanno rinunciato, c'è comunque una vecchia versione nel controllo del codice sorgente. Non c'è alcuna garanzia che quella versione funzioni ancora. Facci sapere come hai deciso.

+0

La classe BaseValidator deriva da un controllo Label, che non è reCAPTCHA. –

+0

Non l'ho mai detto, il mio primo approccio sarebbe stato creare un controllo composito con tutti i controlli necessari al funzionamento del recaptcha e aggiungere semplicemente un controllo aggiuntivo che gestisce la convalida e per la facilità di implementazione deriva dalla classe BaseValidatior (e btw. ** la vecchia versione in realtà derivata da BaseValidator **) – ntziolis

+0

Il modo in cui reCAPTCHA è reso non giustifica l'esistenza di controlli figlio (è composto da un tag

Problemi correlati