Si je crée un UserControl et y ajoute des objets, comment puis-je récupérer le code HTML qu'il rendrait?
ex.
UserControl myControl = new UserControl();
myControl.Controls.Add(new TextBox());
// ...something happens
return strHTMLofControl;
Je voudrais simplement convertir un UserControl nouvellement construit en une chaîne HTML.
Vous pouvez rendre le contrôle à l'aide de Control.RenderControl(HtmlTextWriter)
.
Alimentez StringWriter
dans le HtmlTextWriter
.
Alimentez StringBuilder
dans le StringWriter
.
Votre chaîne générée sera à l'intérieur de l'objet StringBuilder
.
Voici un exemple de code pour cette solution:
StringBuilder myStringBuilder = new StringBuilder();
TextWriter myTextWriter = new StringWriter(myStringBuilder);
HtmlTextWriter myWriter = new HtmlTextWriter(myTextWriter);
myControl.RenderControl(myWriter);
string html = myTextWriter.ToString();
//render control to string
StringBuilder b = new StringBuilder();
HtmlTextWriter h = new HtmlTextWriter(new StringWriter(b));
this.LoadControl("~/path_to_control.ascx").RenderControl(h);
string controlAsString = b.ToString();
UserControl uc = new UserControl();
MyCustomUserControl mu = (MyCustomUserControl)uc.LoadControl("~/Controls/MyCustomUserControl.ascx");
TextWriter tw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(tw);
mu.RenderControl(hw);
return tw.ToString();
Sept ans de retard, mais cela mérite d'être partagé.
La solution généralement acceptée - StringBuilder
en StringWriter
en HtmlWriter
en RenderControl
- est bonne. Mais il y a quelques pièges que j'ai malheureusement rencontrés en essayant de faire la même chose. Certains contrôles génèreront des erreurs s'ils ne se trouvent pas à l'intérieur d'un Page
, et certains généreront des erreurs s'ils ne se trouvent pas à l'intérieur d'un <form>
avec runat="server"
. Le contrôle ScriptManager présente ces deux comportements.
J'ai finalement trouvé une solution de contournement ici. L'essentiel est simplement d'instancier une nouvelle page et un nouveau formulaire avant de faire le travail d'écrivain:
Page page = new Page();
page.EnableEventValidation = false;
HtmlForm form = new HtmlForm();
form.Name = "form1";
page.Controls.Add(form1);
MyControl mc = new MyControl();
form.Controls.Add(mc);
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
HtmlTextWriter writer = new HtmlTextWriter(sw);
page.RenderControl(writer);
return sb.ToString();
Malheureusement, cela vous donne plus de balisage que vous n'en avez réellement besoin (car il inclut le formulaire factice). Et le ScriptManager échouera toujours pour une raison mystérieuse que je n'ai pas encore perplexe. Honnêtement, c'est beaucoup de problèmes et cela ne vaut pas la peine; le but de générer des contrôles dans le code-back est de ne pas avoir à jouer avec le balisage, après tout.
remplacer la méthode REnderControl
protected override void Render(HtmlTextWriter output)
{
output.Write("<br>Message from Control : " + Message);
output.Write("Showing Custom controls created in reverse" +
"order");
// Render Controls.
RenderChildren(output);
}
Cela vous donnera accès à l'auteur sur lequel le code HTML sera écrit.
Vous pouvez également examiner l'architecture de contrôle adaptatif d'asp.net architecture de contrôle adaptatif d'asp.net où vous pouvez "façonner" la sortie html par défaut des contrôles.
Appelez sa méthode .RenderControl()
.