UserControlを作成し、それにオブジェクトを追加した場合、レンダリングするHTMLを取得するにはどうすればよいですか?
例.
UserControl myControl = new UserControl();
myControl.Controls.Add(new TextBox());
// ...something happens
return strHTMLofControl;
新しく作成したUserControlをHTMLの文字列に変換したいだけです。
Control.RenderControl(HtmlTextWriter)
を使用してコントロールをレンダリングできます。
StringWriter
をHtmlTextWriter
にフィードします。
StringBuilder
をStringWriter
にフィードします。
生成された文字列はStringBuilder
オブジェクト内にあります。
このソリューションのコード例を次に示します。
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();
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は、私がまだ困惑していない難解な理由で失敗します。正直なところ、それは非常に多くのトラブルであり、実行する価値はありません。コードビハインドでコントロールを生成する全体のポイントは、結局のところ、マークアップをいじる必要がないようにすることです。
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出力を「整形」することもできます。コントロールから。
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 .
.RenderControl()
メソッドです。