ASP.NET:获取.ascx的标记

时间:2010-01-21 22:50:09

标签: asp.net user-controls

假设我有一个.ascx用户控件。如何将其HTML标记转换为字符串?

5 个答案:

答案 0 :(得分:6)

使用LoadControl()方法将其放入页面后,您可以通过调用其上的Render()方法来获取HTML。它需要一个HtmlTextWriter来编写,但构造起来相当简单:

var userControl = (userControlType)Page.LoadControl( ....ascx);
StringBuilder sb = new StringBuilder();
StringWriter SW = new StringWriter(SB);
HtmlTextWriter htw = new HtmlTextWriter(new StringWriter(sb));
userControl.RenderControl(htw);

string html = sb.ToString();

如果您不在页面上下文中,则可以other ways来执行此操作。

答案 1 :(得分:1)

我还没有验证代码,但理论上如果你有对UserControl的引用,你应该可以调用Render()

StringBuilder sb = new StringBuilder();
using (StringWriter tw = new StringWriter(sb))
using (HtmlTextWriter hw = new HtmlTextWriter(tw))
{
    ctrl.Render(hw);
}
return sb.ToString(); 

答案 2 :(得分:0)

您没有通过“获取HTML”来解释您的意思。

如果您正在谈论Web客户端,那么获取标记的方法是 发送HTTP GET到URL。

答案 3 :(得分:0)

在调用UserControl的Render()方法之前,通常不会创建UserControl的HTML。该方法生成HTML并将内容发送到HtmlTextWriter。

查看有关UserControl.Render()的文档以获取更多信息。

答案 4 :(得分:0)

尝试一下,就像一个从用户控件中抓取生成的标记的冠军

    Dim controlText As String = String.Empty
    controlText = Me.GenerateControlMarkup("/SampleUserControl/Grid.ascx")

Public Class SacrificialMarkupPage
    Inherits Page
    Public Overloads Overrides Sub VerifyRenderingInServerForm(ByVal control As Control)
    End Sub
End Class

Private Function GenerateControlMarkup(ByVal virtualPath As String) As [String]
    Dim page As New SacrificialMarkupPage()
    Dim ctl As UserControl = DirectCast(page.LoadControl(virtualPath), UserControl)
    page.Controls.Add(ctl)
    Dim sb As New StringBuilder()
    Dim writer As New StringWriter(sb)

    page.Server.Execute(page, writer, True)
    Return sb.ToString()
End Function