c# - net - Permitir que aparezca la página.ASPX antes de que el control.ASCX termine de cargarse?
update mysql asp net c# (3)
La única forma posible de lograr esto es configurándolo como un recurso HTTP separado. Por el momento .NET está integrando el control en la página para que esté esperando hasta que tenga todo lo que necesita para responder.
Puedes hacer esto de muchas maneras diferentes:
- Servicio web al que se llama mediante javascript
- Separar página que contiene el control (y está alojado dentro de un iFrame para parecer estar en la misma página)
La mejor manera de hacer esto sería usar un iFrame (o algo similar) que le indicará al navegador que solicite el control después de que se haya enviado la página principal.
Tengo una página ASP.NET con un control (.ascx) en ella. La página (.aspx) onload asigna algo de texto a un par de etiquetas y pasa una identificación de producto al control .ascx. El control .ascx, onload, toma ese ID de producto de la página .aspx y entra en la base de datos varias veces, realiza varios cálculos, etc., básicamente tarda mucho tiempo en cargarse.
Entonces, cuando hago clic en un enlace a esta página .aspx, la página tarda entre 7 y 10 segundos en cargarse. Lo he reducido a los cálculos sobre el control de .ascx siendo el culpable y he optimizado el código tanto como puedo ... pero todavía me está tomando demasiado tiempo.
¿Hay alguna forma de cargar la página .aspx ANTES de cargar el control? (¿Quizás muestre una animación de "Cargando ..."? ¿Como se usó en un UpdateProgress?)
Personalmente, nunca usaría un iFrame para cargar contenido en una página; eso es más como un hack que nada y además, iframe == "malo".
Pero tienen razón, no podrás hacer nada de lo que estás buscando.
Si el control del usuario NO tiene ningún control web que cause una devolución de datos (o tiene controles de formulario a los que deba acceder durante una devolución de datos), entonces usaría AJAX para solicitar los datos en el servidor una vez que la página ya se haya cargado y utilizado javascript para mostrar el contenido en la página.
Puedes hacer esto con un UpdatePanel. Te tomará un pequeño truco, pero intenta algo como esto:
1) Ponga el UserControl
en un UpdatePanel
.
2) Ponga una propiedad pública en su IsEnabled
como IsEnabled
que usará para no hacer nada de manera condicional o renderizar "por favor espere". Establecerlo como falso desde su página principal.
3) Agregue un código en OnInit
a su página principal:
if (MyScriptManager.IsInAsyncPostback) {
MyUserControl.IsEnabled=true;
}
4) Agregue un script de cliente en esta línea:
finished=false;
Sys.WebForms.PageRequestManager.pageLoaded(function(sender,args) {
if (!finished) {
finished=true;
__doPostBack('''','''');
// you can include the uniqueID of your updatepanel as the first arg
// otherwise it will refresh all update panels
}
});
o con jquery ..
finished=false;
$(document).ready(function() {
if (!finished) {...
}
});
Lo que esto debería hacer es provocar que se inicie una devolución de datos asíncrona inmediatamente después de que la página se termine de cargar, lo que a su vez causará que el panel de actualización se actualice. Como lo configuraste para que esté habilitado cuando está en una devolución de datos asíncrona, se renderizará la segunda vez.