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
La soluzione per questo problema è la seguente:
- Set ValidationGroup al pulsante Login. Il controllo reCAPTCHA non verrà convalidato quando si fa clic su un pulsante con ValidationGroup impostato su non vuoto.
- 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.
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.
La classe BaseValidator deriva da un controllo Label, che non è reCAPTCHA. –
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
Il modo in cui reCAPTCHA è reso non giustifica l'esistenza di controlli figlio (è composto da un tag
- 1. Accesso alla finestra principale dal controllo utente
- 2. Modifica del titolo della pagina padre dal controllo utente
- 3. Accesso alle proprietà principali della pagina principale in un codice della pagina principale nidificato dietro
- 4. Equivalente PHP della pagina principale in ASP.NET
- 5. Controllo CustomErrors attivato nel codice
- 6. impedire iframe dal reindirizzamento della pagina padre
- 7. Controllo pagina Android come controllo pagina iPhone
- 8. jQuery ready evento non attivato sul caricamento parziale della pagina
- 9. accesso al controllo della finestra principale in UserControl
- 10. immagini della pagina principale non visualizzate nelle pagine secondarie
- 11. Chiamare un metodo nella pagina padre dal controllo utente
- 12. Accesso alla pagina padre Proprietà dal controllo utente
- 13. come fermare un runloop attivato dal timer?
- 14. Ottieni il titolo della pagina nel codice della pagina principale dietro
- 15. Esegui Web di Azure attivato dal codice
- 16. .NET Recaptcha https
- 17. Aggiungere un controllo per l'intestazione della pagina in ASP.NET
- 18. Aumentare il timeout della sessione reCAPTCHA
- 19. valore dell'etichetta della pagina principale non viene aggiornato il contenuto del modulo pagina
- 20. Ottieni il valore variabile dal codice sottostante e utilizza il controllo della pagina aspx
- 21. Ottieni l'ID dell'oggetto Pagina principale nella pagina di contenuto
- 22. Separazione della rotta 2 angolare dal file dell'app principale
- 23. Chiamare i metodi della direttiva dal controller principale in AngularJS
- 24. Google ReCaptcha non postando 'g-recaptcha-response'
- 25. Problemi di pagina principale e file ASP.Net
- 26. casella reCAPTCHA non allineata correttamente
- 27. Recaptcha crea iFrame sulla pagina, rompe lo stile
- 28. come accedere al controllo della pagina mastro dalla pagina di contenuto
- 29. Importazione macro dal modulo principale
- 30. Traduzione Recaptcha
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
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. –
Questo è fantastico! Lo proverò molto presto, grazie per la correzione. – ntziolis