2011-11-11 15 views
5

Ho un carico di oggetti UserControl (file ascx) nel loro piccolo progetto. Quindi faccio riferimento a questo progetto in due progetti: l'API REST (che è un progetto di libreria di classi) e il sito Web principale.Rendering software di un Web UserControl

Sono sicuro che questo sarebbe facile nel sito Web, semplicemente utilizzare Controls.Add in qualsiasi Panel o controllo ASP.NET funzionerebbe.

Tuttavia, che dire dell'API? C'è un modo per rendere l'HTML di questo controllo, semplicemente conoscendo il tipo di controllo? Il metodo RenderControl non scrive alcun HTML per il writer in quanto il ciclo di vita del controllo non è nemmeno iniziato.

Si prega di tenere a mente che non ho i controlli nel progetto web, quindi non ho un percorso virtuale per il file ascx. Quindi il metodo LoadControl non funzionerà qui.

Tutti i controlli in realtà derivano dallo stesso controllo di base. C'è qualcosa che posso fare all'interno di questa classe base che mi permetterà di caricare il controllo da un'istanza completamente nuova?

risposta

8

Questo è ciò che ho fatto di recente, funziona bene, ma capisco che i postback non funzioneranno se lo si utilizza all'interno dell'app ASP.NET.

[WebMethod] 
public static string GetMyUserControlHtml() 
{ 
    return RenderUserControl("Com.YourNameSpace.UI", "YourControlName"); 
} 

public static string RenderUserControl(string assembly, 
      string controlName) 
{ 
     FormlessPage pageHolder = 
       new FormlessPage() { AppRelativeTemplateSourceDirectory = HttpRuntime.AppDomainAppVirtualPath }; //allow for "~/" paths to resolve 

     dynamic control = null; 

     //assembly = "Com.YourNameSpace.UI"; //example 
     //controlName = "YourCustomControl" 
     string fullyQaulifiedAssemblyPath = string.Format("{0}.{1},{0}", assembly, controlName); 

     Type type = Type.GetType(fullyQaulifiedAssemblyPath); 
     if (type != null) 
     { 
      control = pageHolder.LoadControl(type, null); 
      control.Bla1 = "test"; //bypass compile time checks on property setters if needed 
      control.Blas2 = true; 

     }       

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


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

Un bell'aspetto. Sto solo cercando di implementarlo ora nella mia struttura. Una cosa che ho notato però - 'Forma HtmlForm = new HtmlForm();'. Questa variabile non è mai usata, perché 'form.Controls.Add' è commentato? Mi sto perdendo qualcosa? – Connell

+0

Aggiornerò, c'è un modo per fare con un modulo normale, ma se il tuo controllo non ha un tag del modulo o non ne aggiungi uno in modo programmatico, avrai un errore di runtime. Questo è ciò che la classe FormLessPage ignora per te. –

1

This dovrebbe funzionare. È possibile creare un controllo di quel tipo e utilizzare il proprio HtmlTextWriter.

Problemi correlati