使用.ashx生成的ASP.Net服务器控制代码

时间:2010-04-28 18:46:01

标签: asp.net httphandler ashx htmltextwriter

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

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

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

当我尝试使用InnerHtml属性时出现HtmlTable错误(表示不支持),当我尝试使用RenderControl时,首先创建一个TextWriter,接下来是一个HtmlTextWriter对象,我得到的页面不能为null。

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

2 个答案:

答案 0 :(得分:2)

* 最近一次是在上面。

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

首先,我们必须使用内置form的页面。否则,我们将无法添加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());
}

这很有效。输出很大,所以我决定不将它包含在我的答案中:))


实际上,有一种解决方法。是的,我们可以在处理程序中渲染一个控件。

首先,我们需要一个无形页面。因为没有它我们得到:

  

控制'Button'类型的'btnSumbit'   必须放在表格标签内   RUNAT =服务器。

public class FormlessPage : Page
{
    public override void VerifyRenderingInServerForm(Control control)
    {
    }
}

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

FormlessPage page = new FormlessPage();
Button button = new System.Web.UI.WebControls.Button
{
    ID = "btnSumbit",
    Text = "TextButton",
    UseSubmitBehavior = true
};
page.Controls.Add(button);

第三,让我们捕捉输出。为此,我们使用HttpServerUtility.Execute方法:

  

执行指定的处理程序   虚拟路径在上下文中   当前的要求。一个   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());
}

结果将是:

<input type="submit" name="btnSumbit" value="TextButton" id="btnSumbit" />

此外,我可以推荐ScottGu的文章Tip/Trick: Cool UI Templating Technique to use with ASP.NET AJAX for non-UpdatePanel scenarios。希望,你可以在那里找到很多有用的东西。

答案 1 :(得分:1)

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

本文详细介绍:http://msdn.microsoft.com/en-us/magazine/cc163879.aspx