He desarrollado un tablero web que tiene una estructura de controles incrustada dentro de los controles. En muchos escenarios, tengo la ID de un control y necesito estar trabajando en el objeto de control real. Como tal, utilizo un método de utilidad, una implementación FindControl recursiva, que busca en la página (o cualquier otro objeto provisto, pero siempre uso la página), para la identificación del control.Luchando para alejarme del recursivo Page.FindControl
/// <summary>
/// Page.FindControl is not recursive by default.
/// </summary>
/// <param name="root"> Page </param>
/// <param name="id"> ID of control looking for. </param>
/// <returns> The control if found, else null. </returns>
public static Control FindControlRecursive(Control root, string id)
{
if (int.Equals(root.ID, id))
{
return root;
}
foreach (Control control in root.Controls)
{
Control foundControl = FindControlRecursive(control, id);
if (!object.Equals(foundControl,null))
{
return foundControl;
}
}
return null;
}
Esta función tiene la capacidad de volverse bastante lenta. Me di cuenta cuán lento una vez que puse log4net iniciando sesión en él. Ahora trato de alejarme de donde pueda, pero no estoy seguro de qué otras opciones tengo, si es que tengo alguna.
Por ejemplo, el usuario arrastra y suelta un control en mi página web. El controlador de eventos es el siguiente:
protected void RadListBox_Dropped(object sender, RadListBoxDroppedEventArgs e)
{
//e.HtmlElementID is the UniqueID of the control I want to work upon.
RadDockZone activeControlDockZone = Utilities.FindControlRecursive(Page, e.HtmlElementID) as RadDockZone;
}
No hay garantía de que este control será el hijo directo de la página, y yo no (por lo que yo sé!), Tienen la capacidad para determinar dónde en mi controla esta ID, excepto al buscar desde la página hacia abajo.
Lo único que puedo pensar es mantener una tabla de búsqueda de cada objeto en la página, pero parece una idea equivocada.
¿Alguien más ha experimentado este problema?
Tiene usted considera o mirado en ViewState? – Joe
Esperando encontrar una solución que sea compatible con MVC Framework. Voy a intentar hacer la transición de este proyecto a ese después de esta última refactorización. Tengo entendido que ViewState no es compatible con MVC. ¿Es aceptable pensar en mi ASP.NET Page.FindControl como el método ViewPage.FindControl? ¿Experimentaré la misma lentitud? –