2010-04-02 11 views
5

Tengo una página .aspx de C#/ASP.NET que declara dos controles que representan el contenido de una pestaña. Quiero un argumento de cadena de consulta (por ejemplo,? Tab = 1) para determinar cuál de los dos controles está activado. Mi problema es que ambos pasan por los eventos de inicialización y completan sus controles secundarios, desperdiciando recursos de la CPU y ralentizando el tiempo de respuesta. ¿Es posible desactivarlos de alguna manera para que no sufran ninguna inicialización?¿Cómo declaro un control de usuario web C# pero no de inicializo?

Mi página .aspx se ve así:

<% if (TabId == 0) 
    { %> 
<my:usercontroltabone id="ctrl1" runat="server" /> 
<% } 
    else if (TabId == 1) 
    { %> 
<my:usercontroltabtwo id="ctrl2" runat="server" /> 
<% } %> 

Y esa parte funciona bien. Supuse que <% significaría que el control no se declararía y no se inicializaría, pero eso no es así ...

Respuesta

7

Si el código del lado del servidor en línea/spaghetti no ayuda, solo puedo pensar en una solución alternativa: evite declarar los controles en el marcado. En su lugar, cargue el control que realmente desea en la página desde su controlador de eventos Page_Init. El método Page.LoadControl() se puede utilizar para esto:

void Page_Init(object sender, System.EventArgs e) 
{ 
    Control tab; 

    switch (TabId) 
    { 
     case 0: tab = LoadControl("usercontroltabone.ascx"); break; 
     case 1: tab = LoadControl("usercontroltabtwo.ascx"); break; 
     default: tab = LoadControl("defaulttab.ascx"); break; 
    } 

    somePlaceholder.Controls.Add(tab); 
} 
+0

Acepto que el código de spaghetti debe ir. La lógica debe permanecer en el código subyacente para mantener las cosas orientadas a objetos. – Daniel

+0

De esta manera funciona bien, la advertencia es si usted está dependiendo de viewstate. Viewstate no se carga automágicamente en controles agregados dinámicamente. –

+0

@Chuck: si mi memoria me sirve correctamente (ha pasado algún tiempo desde que trabajé mucho con formularios web) eso realmente depende de * cuándo * se cargan los controles. Creo que cargar en 'Page_Init' en lugar de' Page_Load' resuelve (la mayoría de) los problemas de viewstate. –

1

mueve el código de inicialización de .Load a su propio método público personalizado, y llame al iniciador explícitamente cuando sea apropiado.

0

aplicar su lógica en el código subyacente.

Declarar el control:

<my:usercontroltabtwo id="ctrl2" Visible="False" runat="server" /> 

Y a continuación, establecer la visibilidad:

if(TabId == 0) 
{ 
ctrl1.Visible = true; 
} 
else if(TabId == 1) 
{ 

ctrl2.Visible = true; 
} 
+2

Esto no ayudará. – SLaks

+0

@Chuck: Eso es básicamente lo que estaba haciendo, pero ctrl1 y ctrl2 (y todos sus controles secundarios) obtuvieron los eventos de inicio de todos modos, que es lo que estoy tratando de evitar. –

+0

Agregando al comentario de SLaks: Este enfoque solo causará que el control no * rinda *, pero aún se cargará y se inicializará en el árbol de control. Esencialmente, esto es lo que el OP ya tiene. –

0

UserControl.dispose() evento de detención método Page_Load usercontrol al fuego.

+0

Esto no funcionó para mí. Solo parecía destrozar mi página. –

Cuestiones relacionadas