web-dev-qa-db-ja.com

.NET(C#)でUserControlのHTML出力を取得するにはどうすればよいですか?

UserControlを作成し、それにオブジェクトを追加した場合、レンダリングするHTMLを取得するにはどうすればよいですか?

例.

UserControl myControl = new UserControl();
myControl.Controls.Add(new TextBox());

// ...something happens

return strHTMLofControl;

新しく作成したUserControlをHTMLの文字列に変換したいだけです。

48
Jon Smock

Control.RenderControl(HtmlTextWriter)を使用してコントロールをレンダリングできます。

StringWriterHtmlTextWriterにフィードします。

StringBuilderStringWriterにフィードします。

生成された文字列はStringBuilderオブジェクト内にあります。

このソリューションのコード例を次に示します。

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

7年遅れですが、これは共有するに値します。

一般的に受け入れられているソリューション-StringBuilder into StringWriter into HtmlWriter into RenderControl-は適切です。しかし、いくつかの落とし穴があります。残念ながら、同じことをしようとしている間に出くわしました。一部のコントロールは、Pageの内部にない場合にエラーをスローし、一部のコントロールは<form>を含むrunat="server"の内部にない場合にエラーをスローします。 ScriptManagerコントロールは、これらの両方の動作を示します。

最終的にここで回避策を見つけました。 基本的には、ライターの作業を行う前に、新しいページとフォームをインスタンス化するだけです。

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

残念ながら、これは実際に必要なものよりも多くのマークアップを提供します(ダミーフォームが含まれているため)。そして、ScriptManagerは、私がまだ困惑していない難解な理由で失敗します。正直なところ、それは非常に多くのトラブルであり、実行する価値はありません。コードビハインドでコントロールを生成する全体のポイントは、結局のところ、マークアップをいじる必要がないようにすることです。

8
Reikim

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

これにより、HTMLが書き込まれるライターにアクセスできます。

Asp.netの適応制御アーキテクチャ asp.netの適応制御アーキテクチャ を調べて、デフォルトのhtml出力を「整形」することもできます。コントロールから。

4
Xian

HttpServerUtility.Executeで利用可能なHttpContext.Current.Server.Executeメソッドを利用できます:

var page = new Page();
var myControl = (MyControl)page.LoadControl("mycontrol.ascx");
myControl.SetSomeProperty = true;
page.Controls.Add(myControl);
var sw = new StringWriter();
HttpContext.Current.Server.Execute(page, sw, preserveForm: false);

利点は、ユーザーコントロールのPage_Loadイベントもトリガーすることです。

MSDNドキュメントは次の場所にあります: https://msdn.Microsoft.com/en-us/library/fb04e8f7(v = vs.110).aspx .

1
Carl in 't Veld

.RenderControl()メソッドです。

1
Joel Coehoorn