Возможно ли в ASP.NET взять строку, содержащую некоторый HTML, и заставить ASP.NET проанализировать ее и создать для меня элемент управления? Например:
string rawHTML = "<table><td><td>Cell</td></tr></table>";
HTMLTable table = MagicClass.ParseTable(rawHTML);
Я знаю, что это плохой поступок, но я нахожусь в неприятной ситуации, поскольку это действительно единственный способ достичь того, что мне нужно (поскольку я не могу изменить код этого конкретного коллеги).
Кроме того, я знаю, что LiteralControl позволяет вам иметь элемент управления с произвольным HTML в нем, но, к сожалению, мне нужно преобразовать их в надлежащий элемент управления.
К сожалению, HTMLTable не поддерживает свойство InnerHTML. Мне нужно сохранить дерево HTML в том виде, в каком оно есть, поэтому я не могу поместить его в тег <div>.
Спасибо.





Вы можете перемещаться по строке HTML по токену за раз (токен, определенный здесь как элемент HTML или HTML InnerText), и определять, какой элемент управления необходимо создать и какие атрибуты ему нужны. Но это было бы чем-то очень ... злым в написании.
Почему именно вам нужно, чтобы это был «правильный» элемент управления, а не текст внутри элемента управления Literal?
Я думаю, что вам ближе всего будет Page.ParseControl, который является синтаксическим анализатором ASP.NET. Обратной стороной является то, что текст у вас является является LiteralControl, поскольку на нем нет runat = "server" - так что вы заранее выполните очень крошечные операции со строками.
Другими словами:
this.ParseControl("<table><tr><td>Cell</td></tr></table>")
произведет:
Control
LiteralControl
тогда как:
this.ParseControl("<table runat=\"server\"><tr><td>Cell</td></tr></table>")
произведет:
Control
HtmlTable
HtmlTableRow
HtmlTableCell
LiteralControl
Мне это кажется очень странным, но я должен сказать, что мне это немного нравится. Никогда об этом не слышал, но это именно то, что мне сейчас нужно.
Один совет для всех, кто использует этот подход в библиотеке: ParseControl завершится ошибкой, если вы не укажете значение для атрибута AppRelativeVirtualPath в объекте Page. Например, в VB: Dim pg As New Web.UI.Page pg.AppRelativeVirtualPath = "~ \\"
Код, который я должен использовать (и, к сожалению, не могу изменить), предназначен для заполнения PlaceHolder некоторыми объектами HTMLControl, а затем он проверяет эти элементы и делает некоторые вещи на основе этого. К сожалению, у меня есть только необработанное HTML-содержимое PlaceHolder, поэтому мне нужно его воссоздать.