1

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

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

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

当我尝试使用 InnerHtml 属性时出现 HtmlTable 错误(说它不受支持),并且当我尝试 RenderControl 时,在首先创建一个 TextWriter 和下一个 HtmlTextWriter 对象后,我收到错误页面不能为空。

有没有人这样做过?有什么建议么?

4

2 回答 2

2

*最新的是上面。

好的,即使在马特的更新之后也有解决方法;)

首先,我们必须使用带有forminside 的页面。否则我们将无法添加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=server 的表单标记内。

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方法:

在当前请求的上下文中执行指定虚拟路径的处理程序。A System.IO.TextWriter从执行的处理程序中捕获输出,布尔参数指定是否清除 System.Web.HttpRequest.QueryStringSystem.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 场景。希望,你可以在那里找到很多有用的东西。

于 2010-04-28T19:36:21.683 回答
1

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

本文有详细信息:http: //msdn.microsoft.com/en-us/magazine/cc163879.aspx

于 2010-04-28T19:05:11.250 回答