Share via


Получение HTML разметки элемента управления

Интересный вопрос задали мне сегодня – как можно получить код разметки элемента управления в виде строки. Например, если этот фрагмент HTML как-то должен быть использован в веб-службе, либо возвращен в качестве ответа на Ajax запрос или сохранена в файл после трансформации.

Сделать это можно очень просто. Представим себе, что у нас есть следующий контрол:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="DataControl.ascx.cs"
    Inherits="DemoWebApp.Pages.DataControl" %>
<asp:XmlDataSource ID="XmlDataSource1" runat="server" XPath="/feed/item" DataFile="~/App_Data/Data.xml">
</asp:XmlDataSource>
<asp:Repeater ID="Repeater1" runat="server" DataSourceID="XmlDataSource1">
    <HeaderTemplate>
        <table>
    </HeaderTemplate>
    <ItemTemplate>
        <tr>
            <td>
                <%# XPath("date") %>
            </td>
            <td>
                <%# XPath("title")%><br />
                <%# XPath("text")%>
            </td>
        </tr>
    </ItemTemplate>
    <FooterTemplate>
        </table>
    </FooterTemplate>
</asp:Repeater>

Мы можем получить HTML разметку для него следующим образом:

public string GetControlHtmlMarkup()
{
    Page pg = new Page();
    UserControl uc = (UserControl)pg.LoadControl("~/Pages/DataControl.ascx");
    pg.Controls.Add(uc);
    StringWriter sw = new StringWriter();
    HttpContext.Current.Server.Execute(pg, sw, false);
    return sw.ToString();
}

Процесс прост – создаем объект страницы Page, добавляем на него элемент управления, выполняем страницу в текущем контексте сервера и возвращаем полученную разметку. В результате получаем что-то вроде:

<table>
    <tr>
        <td>01/02/2010</td>
        <td> Title 1<br />This is a short text.</td>
    </tr>
    <tr>
        <td> 11/02/2010 </td>
        <td> Title 2 - Hello<br /> Lorem lorem, ipsum ipsum. </td>
    </tr>
</table>