C# 不带页面的呈现控件
我目前正在使用一个内部框架。这一切都很好,但框架不使用aspx页面,而是使用Response.Write呈现页面。我遇到的问题是,我需要在页面上使用rad控件,所以我需要做的就是生成rad控件来获取HTML代码,以便将其转储到页面上。这可能吗?我试着创建一个页面对象来让它工作,但它不工作。似乎当调用一个页面时,它正在进行其他初始化。我还尝试将HttpContext.Current.Handler强制转换为页面,但没有成功,因为它们使用的是另一个类,而不是System.Web.UI.page来处理请求 在这一点上,我不太确定还有什么可以尝试。如果我能mimc页面创建类,那就太好了。有人知道正确创建和初始化页面对象的确切步骤吗 希望这是有意义的。。。如果没有,我会尽量让它更容易理解 谢谢 更新 只是想给你我正在玩的代码。希望这将向您展示我正在尝试做的事情: 这是有效的:C# 不带页面的呈现控件,c#,asp.net,C#,Asp.net,我目前正在使用一个内部框架。这一切都很好,但框架不使用aspx页面,而是使用Response.Write呈现页面。我遇到的问题是,我需要在页面上使用rad控件,所以我需要做的就是生成rad控件来获取HTML代码,以便将其转储到页面上。这可能吗?我试着创建一个页面对象来让它工作,但它不工作。似乎当调用一个页面时,它正在进行其他初始化。我还尝试将HttpContext.Current.Handler强制转换为页面,但没有成功,因为它们使用的是另一个类,而不是System.Web.UI.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文件等。我认为问题可能在于,当我创建页面的新实例时,它不知道该页面引用所有资源的位置。有没有办法将页面设置为“虚拟”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();
您可以尝试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();
}
我还有一个从页面继承的类,该类将禁用对表单中所有控件的检查:
public partial class MyPage : System.Web.UI.Page
{
public override void VerifyRenderingInServerForm(Control control)
{
return;
}
}
经过大量的研究,我终于找到了生成页面所缺少的内容。显然,有一个函数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();
}
我还有一个从页面继承的类,该类将禁用对表单中所有控件的检查:
public partial class MyPage : System.Web.UI.Page
{
public override void VerifyRenderingInServerForm(Control control)
{
return;
}
}
那不行。我认为它可以与普通控件一起工作,但是Rad控件使用的是页面中没有初始化的其他控件。它是自定义控件之一,好的。你应该试着在支持论坛上提问。我试过了,没有人知道。希望这里有人能给我一个主意。那不行。我认为它可以与普通控件一起工作,但是Rad控件使用的是页面中没有初始化的其他控件。它是自定义控件之一,好的。你应该试着在支持论坛上提问。我试过了,没有人知道。希望这里有人能给我一个想法。你有你开发的这个方法的例子吗?我真的很好奇,因为我正在竭尽全力让telerik控件在自定义服务器控件中以“我的”方式工作。很遗憾,他们没有更好地支持它。我猜这对用户控件不起作用,因为它们需要编译,而这段代码没有这样做。您是否有一个您开发的这种方法的示例?我真的很好奇,因为我正在竭尽全力让telerik控件在自定义服务器控件中以“我的”方式工作。很遗憾,他们没有更好地支持它。我猜这对用户控件不起作用,因为它们需要编译,而这段代码没有做到这一点。