无页面渲染控制

时间:2011-06-14 15:55:41

标签: c# asp.net

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

此时我不太确定还有什么可以尝试的。如果我可以模仿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));

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

经过大量研究后,我设法找出了生成页面所缺少的内容。显然有一个函数,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;
    }
}