2009-05-08 11 views
10

C'è un modo in cui posso utilizzare C# per caricare e quindi "renderizzare" un controllo ascx?Caricare il componente ascx utilizzando il codice C#

In sostanza sto cercando di sostituire ASP in linea con una funzione C# che restituirà lo stesso HTML. Questo mi permetterebbe di impostarlo come un webmethod in modo che io possa aggiornare quella sezione della pagina con jQuery, usando lo stesso codice che ha generato l'html originale.

Ho davvero bisogno di un modo per farlo, e questo mi sembra un percorso logico.

risposta

17

È necessario creare una pagina in cui si esegue il rendering del controllo:

public static string RenderUserControl(string path) 
{ 
    Page pageHolder = new Page(); 
    Control viewControl = pageHolder.LoadControl(path); 

    pageHolder.Controls.Add(viewControl); 
    using(StringWriter output = new StringWriter()) 
    { 
     HttpContext.Current.Server.Execute(pageHolder, output, false); 
     return output.ToString(); 
    } 
} 

un controllo utente da solo non renderà. (This article ha alcune informazioni correlate da cui ho preso in prestito del codice).

1

non ho provato questo, ma è possibile inserire un controllo utilizzando la funzione LoadControl:

Control Example = LoadControl("~\\Controls\\MyControl.ascx"); 

allora si potrebbe provare rendering del controllo:

StringWriter sw = new StringWriter(); 
HtmlTextWriter htw = new HtmlTextWriter(sw); 
Example.RenderControl(htw); 
Response.Write(sw.ToString()); 
Response.End(); 

Ma fare in modo che si ignora VerifyRenderingInServerForm e passare EnableEventValidation a false nella pagina.

Dimentica ciò che ho scritto sopra. Sono tornato e testato e non è possibile chiamare LoadControl perché il metodo web è statico. Dato che è statico, non hai un oggetto Page da chiamare ... Il che significa che non si carica in modo dinamico il controllo dell'utente.

+1

Vi sono in realtà lo più a destra. MyUsercontrol uc = (MyUserControl) Page.LoadControl ("/ percorso/a/MyUserControl.ascx"); Quindi puoi fare SomeItem.Controls.Add (uc); o rendere il controllo alla stringa come hai dimostrato, quindi aggiungere l'elemento dom a livello di codice usando jQuery, o funziona. – Serapth

+0

In realtà non penso che aggiungere il controllo sarebbe un'opzione in questo caso. Nessun postback completo (nessun oggetto di pagina o qualsiasi oggetto a cui aggiungere il controllo), chiamata da jQuery, ecc. Ma l'approccio di Keltex funziona. – JaCraig

1

Questo Explanation dovrebbe avere le risposte che stai cercando. Fondamentalmente devi dichiarare il controllo nella pagina e poi LoadControl nel codebehind.

1

La risposta di Keltex era l'unica che funzionava per me dal momento che stavo lavorando con i controlli utente annidati. Inoltre, se si vuole passare parametri per il controllo utente è possibile farlo:

_MyNameSpace_MyUserControl viewcontrol = (_MyNameSpace_MyUserControl) pageHolder.LoadControl(path); 

viewcontrol.MyParam = "My value"; 
0

è molto semplice da usare:

yourItem.Controls.Add(LoadControl("~/user control File path")); 
Problemi correlati