不带页面的渲染控件

本文关键字:控件 | 更新日期: 2023-09-27 17:59:03

我目前正在使用一个内部框架。这一切都很好,但该框架不使用aspx页面,而是使用Response.Write渲染页面。我遇到的问题是,我需要在页面上使用rad控件,所以我所需要做的就是生成rad控件来获取HTML代码,这样我就可以将其转储到页面上。这可能吗?我试着创建一个Page对象来让它工作,但它不起作用。当一个页面被调用时,它似乎正在进行其他初始化。我还尝试将HttpContext.CurrentHandler强制转换为页面,但没有成功,因为他们使用的是另一个类,而不是System.Web.UI.page来处理请求。

在这一点上,我不太确定还能尝试什么。如果我能模仿页面创建类,那就太棒了。有人知道正确创建和初始化Page对象的确切步骤吗?

希望这是有意义的。。。如果没有,我会尽量让它更容易理解。

谢谢!

更新

我只是想给你我正在玩的代码。希望这能向你展示我正在努力做的事情:

这是有效的:

HtmlForm f = new HtmlForm();
            RadEditor re = new RadEditor();
            f.ID = "form1";

            this.Page.Controls.Add(f);
            re.ID = "rdControl";
            StringBuilder sb = new StringBuilder();
            StringWriter tw = new StringWriter(sb);
            HtmlTextWriter hw = new HtmlTextWriter(tw);
            //Page p = new Page();//(Page)HttpContext.Current.Handler;
            //HtmlForm f = new HtmlForm();
            //p.Controls.Add(f);
            f.Controls.Add(re);

这不起作用:

HtmlForm f = new HtmlForm();
            RadEditor re = new RadEditor();
            f.ID = "form1";
Page p = new Page();
            p.Controls.Add(f);
            re.ID = "rdControl";
            StringBuilder sb = new StringBuilder();
            StringWriter tw = new StringWriter(sb);
            HtmlTextWriter hw = new HtmlTextWriter(tw);
            //Page p = new Page();//(Page)HttpContext.Current.Handler;
            //HtmlForm f = new HtmlForm();
            //p.Controls.Add(f);
            f.Controls.Add(re);

理想情况下,我想让第二个在某种程度上工作,这样我就可以生成代码。抱歉弄得一团糟。这是我的测试代码。

更新

所以我想了想,我想我知道问题出在哪里。控件试图访问dll中不包含的一堆文件,如语言文件、样式、js文件等。我认为问题可能是,当我创建Page的新实例时,它不知道该页面引用所有资源的位置。有没有一种方法可以将页面设置为"虚拟"URL?现在我正在玩这个代码:

HttpContext context = new HttpContext(new HttpRequest(string.Empty, "http://localhost:2090/default.aspx", string.Empty), new HttpResponse(null));

不带页面的渲染控件

您可以尝试RenderControl方法,该方法写入HtmlTextWriter

var stringWriter = new StringWriter();
var htmlWriter = new HtmlTextWriter(stringWriter);
myControl.RenderControl(htmlWriter);
var s = stringWriter.ToString();

经过大量研究,我终于找到了生成页面所缺少的内容。显然有一个函数,p.DesignerInitialize(),用于初始化页面。一旦调用它,它就会生成页面,并且可以从中呈现控件

public string RenderRad()
    {
        StringBuilder sb = new StringBuilder();
        StringWriter tw = new StringWriter(sb);
        HtmlTextWriter hw = new HtmlTextWriter(tw);
        MyPage p = new MyPage();
        p.DesignerInitialize();
        HtmlForm f = new HtmlForm();
        p.Controls.Add(f);
        f.Controls.Add(re);
        re.RenderControl(hw);
        return sb.ToString();
    }

我还有一个从Page继承的类,它将禁用对所有控件的检查:

 public partial class MyPage : System.Web.UI.Page
{
    public override void VerifyRenderingInServerForm(Control control)
    {
        return;
    }
}