51

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

元。

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

// ...something happens

return strHTMLofControl;

新しく構築された UserControl を HTML の文字列に変換したいだけです。

4

7 に答える 7

57

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

にフィードStringWriterHtmlTextWriterます。

にフィードStringBuilderStringWriterます。

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

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

string html = String.Empty;
using (TextWriter myTextWriter = new StringWriter(new StringBuilder()))
{
    using (HtmlTextWriter myWriter = new HtmlTextWriter(myTextWriter))
    {
        myControl.RenderControl(myWriter);
        html = myTextWriter.ToString();
    }
}
于 2008-11-13T21:35:53.327 に答える
32
//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();
于 2009-05-07T02:58:43.783 に答える
15
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();
于 2011-01-23T23:10:34.417 に答える
8

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

一般的に受け入れられている解決策 - StringBuilderinto StringWriterinto HtmlWriterinto RenderControl- は良いです。しかし、残念なことに、同じことをしようとしているときに出くわした落とし穴がいくつかあります。一部のコントロールは、 内にない場合にエラーをスローし、一部のコントロールはwithPage内にない場合にエラーをスローします。ScriptManager コントロールは、これらの両方の動作を示します。<form>runat="server"

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

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 は、まだ理解していない難解な理由で失敗します。正直なところ、これは大変な作業であり、やる価値はありません。コード ビハインドでコントロールを生成することの要点は、結局のところ、マークアップをいじる必要がないようにすることです。

于 2015-07-24T21:03:51.643 に答える
4

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 が書き込まれるライターにアクセスできるようになります。

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

于 2008-11-13T21:36:59.630 に答える
1

その.RenderControl()メソッドを呼び出します。

于 2008-11-13T21:34:19.633 に答える