Получение 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>