2011-11-28 11 views
5

He creado una página para mostrar varios controles de usuario dentro de los paneles de actualización. Algunos controles de usuario se cargarán más rápido y algunos pueden tardar más en cargarse. Ahora, cuando se carga la página, espera a que todos los controles del usuario se carguen y muestra la página solo después de eso. Pero quiero cargar los controles de usuario de forma asíncrona con una imagen de cargador para cada uno de ellos, de modo que los controles de usuario ligeros se carguen fácilmente sin esperar a los más pesados.Carga asincrónica de controles de usuario en una página

Ayúdenme a encontrar una solución.


He cargado con éxito el control de usuario en mi página utilizando el método anterior. Sin embargo, ahora estoy frente a dificultades en controles de usuario que contienen controles de carga ajax como contenedor de pestaña, calendario extensor etc ..

¿Hay alguna forma de solucionar este problema

+0

Tenga en cuenta estos enlaces útiles que afirman resolver el problema: - ["Métodos asincrónicos y controles de usuario"] (http://forums.asp.net/t/1468026.aspx/1) - ["ASP .NET - Control de usuario asíncrono "] (http://rsuharta.wordpress.com/2011/04/27/asp-net-asynchronous-user-control/) –

Respuesta

7

que se ejecutará en un montón de problemas: ViewState, controles necesita etiquetas de formulario, las devoluciones de datos no funcionarán, pero si lo hace con un control que es puramente un View, funcionará bien.

Guión:

//use .ready() or pageLoad() and pass params etc if you need to 
$.ajax({ 
    type: 'POST', 
    url: 'Default.aspx/GetControlViaAjax', 
    data: "{}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function (data) { 
     $('#yourdiv').html(data.d); 
    } 
}); 

WebMethod:

[WebMethod] 
    public static string GetControlViaAjax() 
    { 
     //example public properties, send null if you don't have any 
     Dictionary<string, object> d = new Dictionary<string, object>(); 
     d.Add("CssClass", "YourCSSClass"); 
     d.Add("Title", "Your title"); 
     return RenderUserControl("/yourcontrol.ascx", true, d, null, null); 
     //use this one if your controls are compiled into a .dll 
     //return RenderUserControl(null, true, d, "Com.YourNameSpace.UI", "AwesomeControl"); 

    } 

Render método:

private static string RenderUserControl(string path, bool useFormLess, 
     Dictionary<string, object> controlParams, string assemblyName, string controlName) 
    { 

     Page pageHolder = null; 
     if (useFormLess) 
     { 
      pageHolder = new FormlessPage() { AppRelativeTemplateSourceDirectory = HttpRuntime.AppDomainAppVirtualPath }; //needed to resolve "~/" 
     } 
     else 
     { 
      pageHolder = new Page() { AppRelativeTemplateSourceDirectory = HttpRuntime.AppDomainAppVirtualPath }; 
     } 

     UserControl viewControl = null; 

     //use path by default 
     if(String.IsNullOrEmpty(path)) 
     {  
      //load assembly and usercontrol when .ascx is compiled into a .dll   
      string controlAssemblyName = string.Format("{0}.{1},{0}", assemblyName, controlName); 

      Type type = Type.GetType(controlAssemblyName);    
      viewControl = (UserControl)pageHolder.LoadControl(type, null); 
     } 
     else 
     { 
      viewControl = (UserControl)pageHolder.LoadControl(path);  

     }    

     viewControl.EnableViewState = false; 

     if (controlParams != null && controlParams.Count > 0) 
     { 
      foreach (var pair in controlParams) 
      { 
       Type viewControlType = viewControl.GetType(); 
       PropertyInfo property = 
        viewControlType.GetProperty(pair.Key); 

       if (property != null) 
       { 
        property.SetValue(viewControl, pair.Value, null); 
       } 
       else 
       { 
        throw new Exception(string.Format(
         "UserControl: {0} does not have a public {1} property.", 
         path, pair.Key)); 
       } 
      } 
     } 

     if (useFormLess) 
     {     
      pageHolder.Controls.Add(viewControl); 
     } 
     else 
     { 
      HtmlForm form = new HtmlForm(); 
      form.Controls.Add(viewControl); 
      pageHolder.Controls.Add(form); 
     } 
     StringWriter output = new StringWriter(); 
     HttpContext.Current.Server.Execute(pageHolder, output, false); 
     return output.ToString(); 
    } 

clase FormlessPage:

public class FormlessPage : Page 
    { 
     public override void VerifyRenderingInServerForm(Control control) 
     { 
     } 
    } 
+0

El código anterior me da un error de la siguiente manera .. Un objeto se requiere referencia para el campo, método o propiedad no estático 'System.Web.UI.TemplateControl.LoadControl (System.Type, object [])' – Suhaib

+0

¿Dónde debo escribir el método Render? En la página o en el control de usuario? ¿También dónde estará el código para completar los datos en el control de usuario? Soy muy nuevo en el control del usuario. Por lo tanto, sería mejor si pudiera explicar el método anterior un poco más. Muchas gracias. – Suhaib

+0

Esto es extremadamente avanzado si solo está aprendiendo a escribir UserControls. –

0

controles de usuario probablemente no son la respuesta correcta, ya que están destinados para la composición del lado del servidor. probablemente necesite algunos componentes independientes (en el sentido de ser servidos de forma independiente) en el servidor que sirven los fragmentos html que necesita para que pueda solicitarlos con javascript e introducir el resultado en una página más grande.

Cuestiones relacionadas