【问题标题】:Use ASP.Net server control code generation from .ashx使用 .ashx 生成 ASP.Net 服务器控制代码
【发布时间】:2011-02-13 12:08:39
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: asp.net httphandler ashx htmltextwriter


    【解决方案1】:

    *最新的在上面。

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

    首先,我们必须使用一个内部有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());
    }
    

    这行得通。输出非常大,所以我决定不将其包含在我的答案中:)


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

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

    “按钮”类型的控件“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.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 scenarios。希望,你可以在那里找到很多有用的东西。

    【讨论】:

    • 这对我需要的 90% 都非常有效,所以非常感谢你。但是,我还剩下 1 个障碍。这里有需要渲染的 Telerik 控件。我可以添加控件,但他们需要一个脚本管理器,否则它会在渲染时崩溃。我尝试将一个作为控件添加到页面中,但随后它因对象未设置为实例的错误而爆炸。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      • 2017-05-07
      • 2017-01-15
      • 2013-07-09
      相关资源
      最近更新 更多