ASP.NET модифицирует HTML страницы перед ее отправкой клиенту - PullRequest
7 голосов
/ 10 ноября 2008

Мне нужно перехватить HTML-код ASP.NET непосредственно перед его отправкой клиенту, чтобы выполнить в последний момент манипуляции со строками, а затем отправить измененную версию клиенту.

Е.Г.

Страница загружена Каждый элемент управления отображается правильно Полный HTML-код страницы готов к передаче обратно клиенту

Есть ли способ сделать это в ASP.NET

Ответы [ 6 ]

9 голосов
/ 14 ноября 2008

Вы можете переопределить метод Render вашей страницы. Затем вызовите базовую реализацию и предоставьте объект HtmlTextWriter. Вот пример

protected override void Render(HtmlTextWriter writer)
{
    StringWriter output = new StringWriter();
    base.Render(new HtmlTextWriter(output));
    //This is the rendered HTML of your page. Feel free to manipulate it.
    string outputAsString = output.ToString();

    writer.Write(outputAsString);
}
2 голосов
/ 10 ноября 2008

Вы можете использовать HTTPModule , чтобы изменить HTML. Вот образец .

0 голосов
/ 14 июля 2013

Используя ответ Атанаса Корчева в течение нескольких дней, я обнаружил, что у меня появляются ошибки JavaScript, подобные:

«Не удалось проанализировать полученное с сервера сообщение»

При использовании в сочетании с ASP.NET Ajax UpdatePanel control . Причина описана в этом сообщении в блоге .

В основном UpdatePanel, кажется, критично относится к тому, чтобы точная длина отображаемой строки была постоянной. То есть если вы измените строку и сохраните длину, это будет успешно, если вы измените текст так, чтобы длина строки изменилась, возникает ошибка JavaScript выше.

Моим не идеальным, но работающим решением было предположить, что UpdatePanel всегда делает POST и отфильтровывает это:

protected override void Render(HtmlTextWriter writer)
{
    if (IsPostBack || IsCallback)
    {
        base.Render(writer);
    }
    else
    {
        using (var output = new StringWriter())
        {
            base.Render(new HtmlTextWriter(output));

            var outputAsString = output.ToString();
            outputAsString = doSomeManipulation(outputAsString);

            writer.Write(outputAsString);
        }
    }
}

Это работает в моем сценарии, но имеет некоторые недостатки, которые могут не работать в вашем сценарии:

  • При обратной передаче строки не изменяются.
  • Строка, которую видит пользователь, является неуправляемой
  • UpdatePanel может срабатывать и для НЕ-обратных передач.

Тем не менее, я надеюсь, что это поможет другим, кто обнаружит подобную проблему. Кроме того, см. Эту статью, в которой более подробно обсуждаются UpdatePanel и Page.Render .

0 голосов
/ 10 ноября 2008

Очевидно, что будет намного эффективнее, если вы сможете сначала получить нужную разметку из ASP.Net.

Имея это в виду, рассматривали ли вы вопрос об использовании управляющих адаптеров ? Они позволят вам переопределить то, как каждый из ваших элементов управления рендерит в первую очередь, вместо того, чтобы позже изменять строку.

0 голосов
/ 10 ноября 2008

Не думаю, что на странице есть какое-то конкретное событие, в которое вы можете зацепиться; Вот жизненный цикл ASP.Net: http://msdn.microsoft.com/en-us/library/ms178472.aspx

Возможно, вы захотите подключиться к событию prerender, чтобы «настроить» значения элементов управления, или выполнить некоторые правки / обратные вызовы на стороне клиента.

0 голосов
/ 10 ноября 2008

Посмотрите на последовательность событий в жизненном цикле страницы ASP.NET. Вот одна страница со списком событий. Возможно, вы могли бы найти событие для обработки, которое достаточно запоздало в жизненном цикле страницы, чтобы внести ваши изменения, но все равно получить эти изменения.

Если нет, вы всегда можете написать HttpModule, который обрабатывает HTTP-ответ после того, как сама страница закончит рендеринг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...