2011-11-28 14 views
5

Ho creato una pagina per visualizzare più controlli utente all'interno dei pannelli di aggiornamento. Alcuni controlli utente verranno caricati più velocemente e alcuni potrebbero impiegare più tempo per caricarsi. Ora, quando la pagina viene caricata, attende che tutti i controlli utente vengano caricati e visualizzi la pagina solo dopo. Ma voglio caricare i controlli utente in modo asincrono con un'immagine del caricatore per ciascuno di essi in modo che i controlli utente leggeri vengano caricati facilmente senza attendere quelli più pesanti.Caricamento asincrono dei controlli utente in una pagina

Per favore aiutami a trovare una soluzione.


Ho caricato correttamente il controllo utente nella mia pagina utilizzando il metodo precedente. Tuttavia ora mi sto affrontando difficoltà nel usercontrols di carico con controlli AJAX, come contenitore di scheda, calendario estensore ecc ..

C'è qualche lavoro in giro per questo problema

+0

Si prega di guardare questi link utili che pretendono di risolvere il problema: - ["Metodi asincroni e controlli utente"] (http://forums.asp.net/t/1468026.aspx/1) - ["ASP .NET - Asynchronous User Control "] (http://rsuharta.wordpress.com/2011/04/27/asp-net-asynchronous-user-control/) –

risposta

7

vi imbatterete in una serie di problemi: ViewState, controlli avendo bisogno di tag di modulo, i postback non funzioneranno, ma se si sta facendo questo con un controllo che è puramente un View funzionerà correttamente.

Script:

//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"); 

    } 

metodo Render:

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(); 
    } 

classe FormlessPage:

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

Il codice sopra riportato mi dà un errore come segue. Un oggetto è richiesto un riferimento per il campo, il metodo o la proprietà non statici 'System.Web.UI.TemplateControl.LoadControl (System.Type, object [])' – Suhaib

+0

Dove dovrei scrivere il metodo Render? Nella pagina o nell'usercontrol? Inoltre, dove sarà il codice per riempire i dati nell'usercontrol? Sono molto nuovo per il controllo dell'utente. Quindi sarebbe meglio se potessi spiegare un po 'di più il metodo sopra .. Molte grazie .. – Suhaib

+0

Questo è estremamente avanzato se stai solo imparando a scrivere UserControls. –

0

controlli utente non sono probabilmente la risposta giusta, in quanto sono pensati per la composizione lato server. probabilmente hai bisogno di componenti standalone (nel senso di essere pubblicati autonomamente) sul server che servono i frammenti html di cui hai bisogno in modo che tu possa richiederli con javascript e inserire il risultato nella pagina più grande.

Problemi correlati