【问题标题】:ASP.NET how to Render a control to HTML?ASP.NET 如何将控件呈现为 HTML?
【发布时间】:2010-09-08 16:55:25
【问题描述】:

我有任何 ASP.NET 控件。我要HTML字符串 怎么获取控件的HTML字符串?

【问题讨论】:

    标签: .net asp.net


    【解决方案1】:

    这似乎有效。

    public string RenderControlToHtml(Control ControlToRender)
    {
        System.Text.StringBuilder sb = new System.Text.StringBuilder();
        System.IO.StringWriter stWriter = new System.IO.StringWriter(sb);
        System.Web.UI.HtmlTextWriter htmlWriter = new System.Web.UI.HtmlTextWriter(stWriter);
        ControlToRender.RenderControl(htmlWriter);
        return sb.ToString();
    }
    

    【讨论】:

    • StringWriter 和 HtmlTextWriter 都实现了 IDisposable,因此您可能希望将它们包装在 using() {} 块中。此外,将其作为“Control”的扩展方法可能很有用,因此您可以从实例成员中调用它。
    • @David,你最终是如何将 ascx 文件渲染为 html 的?我尝试了上述方法,但总是得到“对象引用未设置为对象的实例。”,说我引用的用户控件不是实例。我们应该如何在 windows 窗体或控制台应用程序中使用它?
    • 默认的 StringWriter() 构造函数会创建一个新的字符串生成器,因此前两行可以只替换为 System.IO.StringWriter stWriter = new System.IO.StringWriter();
    • 这总是给我一个空字符串。但是,a7drew 的解决方案很有效。
    • 我将 new Controls.sidebar() 传递给函数,但我得到的是空字符串,尽管控件在内联运行时呈现 html。
    【解决方案2】:

    如果控件不是页面的一部分,David Basarab 接受的答案将不起作用。 a7drew 的答案似乎不必要的复杂 - ContextServer.Execute 不需要。

    private string RenderControl()
    {
        var sb = new System.Text.StringBuilder();
        using (var stWriter = new System.IO.StringWriter(sb))
        using (var htmlWriter = new HtmlTextWriter(stWriter))
        {
            var p = new Page();
            var ctrl = (YourControl)p.LoadControl("~/controls/building blocks/YourControl.ascx");
            ctrl.Visible = true;
    
            // do your own init logic if needed
    
            p.Controls.Add(ctrl);
            ctrl.RenderControl(htmlWriter);
            return sb.ToString();
        }
    }
    

    【讨论】:

    • 谢谢你,这行得通!顺便说一句,在我的测试中,ctrl.Visible = true; 行似乎不需要。
    • 谢谢!我有一个有效的方法,但适用于服务,但从 API 调用时无效。这行得通!
    【解决方案3】:

    如果您的控件是 Web 用户控件,您可以通过以下方式访问它从另一个页面或处理程序发出的 HTML:

    public void GetHtmlFromMySweetControl(HttpContext context)
    {
        HttpRequest httpRequest = context.Request;
        HttpResponse httpResponse = context.Response;
    
        string foo = httpRequest["foo"];
    
        Page pageHolder = new Page();
        string path = "~/usercontrols/MySweetControl.ascx";
        MySweetControl ctrl = (MySweetControl)pageHolder.LoadControl(path);
        ctrl.BindProducts(foo);
        pageHolder.Controls.Add(ctrl);
    
        StringWriter sw = new StringWriter();
        context.Server.Execute(pageHolder, sw, false);
        httpResponse.Write(sw.ToString());
    }
    

    【讨论】:

    • 当我尝试这个时,呈现的 HTML 与页面上通常显示的不同。例如,具有 GroupingText 属性的 asp:Panel。 GroupingText 属性的值现在呈现为字段集和图例。这是不可取的......它就像 UserControl 正在某种不同的模式下呈现......完全不同的 HTML...... :(
    • 不错!我什至不知道这是可能的!这允许以非常有效的方式缓存内容!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    相关资源
    最近更新 更多