Peppe Pace

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

lascia un commento »

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.

Written by Giuseppe Pace

Lunedì 26 Novembre 2007 a 20:39

Pubblicato in .NET, Sviluppo

Lascia un commento