使用ASP.Net服务器控件代码从.ashx生成

使用ASP.Net服务器控件代码从.ashx生成,asp.net,httphandler,ashx,htmltextwriter,Asp.net,Httphandler,Ashx,Htmltextwriter,我正在尝试获取以前完整的.aspx页面上的一组现有代码,并在.ashx处理程序中执行相同的操作 代码创建了一个HtmlTable对象,将行和单元格添加到这些行中,然后将该html表添加到.aspx的控件集合中,然后将其添加到页面上已经存在的div中 我试图保持代码的灵活性,但不是将控件放入div中,而是实际生成html,我将返回一大块文本,这些文本可以通过AJAX客户端调用 当我尝试使用InnerHtml属性(表示不支持该属性)时,HtmlTable会出错;当我尝试RenderControl时,

我正在尝试获取以前完整的.aspx页面上的一组现有代码,并在.ashx处理程序中执行相同的操作

代码创建了一个HtmlTable对象,将行和单元格添加到这些行中,然后将该html表添加到.aspx的控件集合中,然后将其添加到页面上已经存在的div中

我试图保持代码的灵活性,但不是将控件放入div中,而是实际生成html,我将返回一大块文本,这些文本可以通过AJAX客户端调用

当我尝试使用InnerHtml属性(表示不支持该属性)时,HtmlTable会出错;当我尝试RenderControl时,在首先创建TextWriter,然后创建HtmlTextWriter对象后,会出现页面不能为null的错误


以前有人这样做过吗?有什么建议吗?

另一个选项是在处理过程中托管ASP.NET HTTP管道,将页面呈现为流,并在处理页面后读取需要从HttpListenerContext.Response.OutputStream流发送的HTML

这篇文章有一些细节:

*上面是最新的

好的,即使在Matt更新之后,也有一个解决方法;)

首先,我们必须使用一个内部带有
表单
的页面。否则,我们将无法添加
ScriptManager
控件。还有一件事:
ScriptManager
控件应该是表单中的第一个控件。更简单的方法是:

Page page = new Page();
Button button = new System.Web.UI.WebControls.Button
{
    ID = "btnSumbit",
    Text = "TextButton",
    UseSubmitBehavior = true
};
HtmlForm form = new HtmlForm
{
    ID="theForm"
};
ScriptManager scriptManager = new ScriptManager
{
    ID = "ajaxScriptManager"
};
form.Controls.Add(scriptManager);
form.Controls.Add(button);
page.Controls.Add(form);

using (StringWriter output = new StringWriter())
{
    HttpContext.Current.Server.Execute(page, output, false);

    context.Response.ContentType = "text/plain";
    context.Response.Write(output.ToString());
}
这很有效。输出非常大,因此我决定不将其包括在我的答案中:)


实际上,有一个解决办法。是的,我们可以在handler中呈现控件

首先,我们需要一个无格式的页面。因为没有它,我们会:

“按钮”类型的控件“btnSumbit” 必须放置在带有 runat=server

其次,没有人能阻止我们创建
FormlessPage
页面的实例。现在,让我们在那里添加一个控件(我决定添加一个
按钮
控件作为示例,但您可以使用任何控件)

第三,让我们捕获输出。为此,我们使用HttpServerUtility。执行方法:

为指定的对象执行处理程序 上下文中的虚拟路径 当前请求。A.
System.IO.TextWriter
捕获输出 从已执行的处理程序和 布尔参数指定是否 清除
System.Web.HttpRequest.QueryString
System.Web.HttpRequest.Form
收藏

代码如下:

using (StringWriter output = new StringWriter())
{
    HttpContext.Current.Server.Execute(page, output, false);

    context.Response.ContentType = "text/plain";
    context.Response.Write(output.ToString());
}
结果将是:


此外,我可以推荐ScottGu的文章。希望你能在那里找到很多有用的东西。

这对我90%的需求非常有效,非常感谢。然而,我还有一个障碍。这里需要呈现Telerik控件。我可以添加控件,但他们需要一个scriptmanager,否则它会在渲染时崩溃。我曾尝试将一个控件添加到页面中,但随后出现了一个错误,即object not set to instance。
FormlessPage page = new FormlessPage();
Button button = new System.Web.UI.WebControls.Button
{
    ID = "btnSumbit",
    Text = "TextButton",
    UseSubmitBehavior = true
};
page.Controls.Add(button);
using (StringWriter output = new StringWriter())
{
    HttpContext.Current.Server.Execute(page, output, false);

    context.Response.ContentType = "text/plain";
    context.Response.Write(output.ToString());
}