Peppe Pace

Autocomplete=”off” per le textbox “autocompletate” con ASP.NET Ajax

with one comment

Ogniqualvolta si implementa l’AutocompleteExtender per una TextBox è necessario disabilitare l’autocompletamento del browser, che tante volte è utile ma non in questo caso. Per farlo però non basta utilizzare la proprietà AutoCompleteType delle TextBox settandola a Disabled perchè questo settaggio funziona solo su Internet Explorer, mentre su altri browser no. Che fare allora? Bisogna aggiungere la coppia attributo/valore autocomplete=”off” ad ogni TextBox, cosa alquanto fastidiosa se le TextBox sono tante, e se poi se ne dimentica qualcuna? Per risolvere quest’annosa questione ho implementato nella classe da cui faccio derivare poi le singole pagine il seguente codice:

        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);
            DisableBrowsersAutocomplete(this);
        }

        /// <summary>
        /// Cerca nel controllo indicato tutti i controlli di tipo Textbox per cui è stato implementato l'autocomplete ed aggiunge l'attributo autocomplete="off"
        /// </summary>
        /// <param name="root">Il controllo in cui effetturare la ricerca delle textbox</param>
        private void DisableBrowsersAutocomplete(Control root)
        {
            if (root is AutoCompleteExtender)
            {
                AutoCompleteExtender ace = (AutoCompleteExtender)root;

                string textboxID = ace.TargetControlID;

                if (!string.IsNullOrEmpty(textboxID))
                {
                    TextBox textbox = this.FindControlRecursive<TextBox>(ace.Parent, textboxID);
                    if (textbox != null)
                    {
                        textbox.Attributes.Add("autocomplete", "off");
                    }
                }
            }
            else if (root.HasControls())
            {
                foreach (Control ctrl in root.Controls)
                {
                    DisableBrowsersAutocomplete(ctrl);
                }
            }
        }

        /// <summary>
        /// Cerca il controllo corrispondente all'Id indicato come parametro, cercando ricorsivamente all'interno del controllo indicato
        /// Per questa funzione utile anche in altre occasioni non ringraziate me bensì Andrea Boschin (http://blog.boschin.it/) e questi 2 post:
        /// http://blogs.ugidotnet.org/PenPal/archive/2006/01/25/33693.aspx
        /// http://blogs.ugidotnet.org/PenPal/archive/2006/01/31/34025.aspx
        /// </summary>
        /// <typeparam name="T">Il tipo del controllo da cercare</typeparam>
        /// <param name="root">il controllo da cui partire con la ricerca</param>
        /// <param name="id">l'id del controllo da cercare</param>
        /// <returns>il controllo trovato oppure il valore di default per il tipo che si cercava</returns>
        public T FindControlRecursive<T>(Control root, string id) where T : Control
        {
            if (root.ID == id && root is T)
                return root as T;

            if (root.HasControls())
            {
                foreach (Control child in root.Controls)
                {
                    T foundControl = FindControlRecursive<T>(child, id);

                    if (foundControl != null)
                        return foundControl;
                }
            }
            return default(T);
        }

Probabilmente la soluzione è migliorabile, magari ce ne sono di più eleganti, sicuramente questa funziona.Spero e credo che il codice sia abbastanza chiaro, se non lo fosse sono qui pronto alle vostre domande, invettive, suggerimenti.

Annunci

Written by Peppe Pace

lunedì 26 novembre 2007 a 20:39

Pubblicato su .NET, Sviluppo

Una Risposta

Subscribe to comments with RSS.

  1. C’è sempre qualche cosa da imparare …
    Non conoscevo l’attributo autocomplete=”off”.

    Per il tuo codice ti consiglio di utilizzare le skin/themes di asp.net.

    In questo modo non hai neanche bisogno di ricompilare il tuo codice.

    Andrea Melis

    martedì 9 febbraio 2010 at 18:18


Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: