web-dev-qa-db-fra.com

Comment obtenir la sortie HTML d'un UserControl dans .NET (C #)?

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.

48
Jon Smock

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();
57
azamsharp
//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();
32
Ben
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();
14
theJerm

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.

8
Reikim

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.

4
Xian

Appelez sa méthode .RenderControl().

1
Joel Coehoorn