【问题标题】:How to load dynamically UserControl that contains asp controls如何动态加载包含asp控件的UserControl
【发布时间】:2011-01-19 10:26:14
【问题描述】:

我有带有 asp 控件的 UserControl(),我想渲染它。

我试过1:

            Page loader = new Page();

            Control ctrl = loader.LoadControl("WebUserControl1.ascx");
            loader.Controls.Add(ctrl);
            loader.ProcessRequest(context);

            StringBuilder sb = new StringBuilder();
            StringWriter sw = new StringWriter(sb);
            HtmlTextWriter htw = new HtmlTextWriter(sw);

            loader.RenderControl(htw);

它不起作用,因为它说每个具有 runat="server" 的控件都必须在 Form 中。

我也试过2:

因为 loader.Form 为空,我创建了 HtmlForm 并将 ctrl 添加到它,然后将 HtmlForm 添加到加载器的控件,但它说它有 2 个 HtmlForm。所以,相反,我将 HtmlForm “注入”到像这样的加载器中

            Page loader = new Page();

            HtmlForm form = new HtmlForm();
            var method = loader.GetType().GetMethod("SetForm", BindingFlags.NonPublic | BindingFlags.Instance);
            method.Invoke(loader, new object[] { form });

            Control ctrl = loader.LoadControl("WebUserControl1.ascx");
            loader.Form.Controls.Add(ctrl);
            loader.ProcessRequest(context);

            StringBuilder sb = new StringBuilder();
            StringWriter sw = new StringWriter(sb);
            HtmlTextWriter htw = new HtmlTextWriter(sw);

            loader.RenderControl(htw);

现在没有发生错误,但是 StringWriter 是空的

我的错误在哪里。 请不要告诉我将 Page 添加到解决方案并覆盖 OnRender。我想按照上面提到的那样去做。

谢谢

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    不要使用 Form.Controls.Add,

    将 PlaceHolder 控件添加到 Form。并将控件添加到 PlaceHolder。

    PlaceHolder.Controls.Add(ctrl);

    试试这个。

    【讨论】:

    • 我在第二次尝试中添加了这个代码: PlaceHolder ph = new PlaceHolder(); ph.Controls.Add(ctrl); loader.Form.Controls.Add(ph); loader.ProcessRequest(上下文);但是 StringWriter 还是空的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多