Autocomplete=”off” per le textbox “autocompletate” con ASP.NET Ajax
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.





