Вопрос по render, asp.net, ektron, c# – Как я могу изменить весь контент страницы ASP.NET прямо перед его выводом?

10

У меня есть страница, на которой есть куча пользовательских элементов управления. Я хочу иметь возможность "макросы» или же "заполнители» непосредственно в содержании, которое будет заменено в моем коде. Это не должноэто не имеет значения, но яЯ использую Ektron в качестве моей CMS.

Есть ли какие-либо события на странице, которые я могу подключить для замены строки на всем отображаемом содержимом страницы, прямо перед этим?отправлено клиенту?

ОБНОВИТЬ

Вот код, который я сейчас использую для этого:

protected override void Render(HtmlTextWriter writer)
{
    string content = string.Empty;

    using (var stringWriter = new StringWriter())
    using (var htmlWriter = new HtmlTextWriter(stringWriter))
    {
        // render the current page content to our temp writer
        base.Render(htmlWriter);
        htmlWriter.Close();

        // get the content
        content = stringWriter.ToString();
    }

    // replace our placeholders
    string newContent = content.Replace("$placeholder1$", "placeholder1 data").Replace("$placeholder2$", "placeholder2 data");

    // write the new html to the page
    writer.Write(newContent);
}

Ваш Ответ

5   ответов
0

который приходит на ум, заключается в использовании asp: Literal для управления "заполнители», Вы можете установить их содержимое во время загрузки страницы или подключиться к событию PreRender и затем установить их.

Извините, я пропустилпользовательский контроль ", моя вина. Пользовательские элементы управления также имеют события PreRender. Вы должны иметь возможность размещать общедоступные свойства в своих пользовательских элементах управления, которые может установить страница, и затем выполнять пользовательские элементы управления для подстановки. Cylon Cat
К сожалению, я могусделать это, потому что они "заполнители» будет внутри контента, который отображается внутри пользовательского элемента управления, что я могуне трогай Таким образом, к тому времени, когда это дойдет до меня, единственное, на что я мог надеяться, это посмотреть на визуализированный контент. John Bubriski
8

Вы пытались переопределить метод рендеринга?

protected override void Render(HtmlTextWriter writer)
{
   StringBuilder htmlString = new StringBuilder(); // this will hold the string
   StringWriter stringWriter = new StringWriter(htmlString);
   HtmlTextWriter tmpWriter = new HtmlTextWriter(stringWriter);
   Page.Render(tmpWriter);
   writer.Flush();

   writer.Write(DoReplaceLogic(htmlString.ToString()););
}
какие's tmpWriter? Alex Nolasco
Да, это правильное место, но возможно ли (и разумно) сделать сброс и прочитать поток? Henk Holterman
вы'никогдасброс» поток, так как он нееще не было отправлено. Я'Я не уверен, если это мудро, нет, я просто ответил на вопрос LOL JustLoren
Я разместил свой код, который в основном делает то, что выделаешь John Bubriski
5

что этот ответ не поможет, так как вы уже решили эту проблему и пошли дальше. Это только для людей, которые столкнутся с подобной проблемой в будущем;)

Есть два подхода, которые вы можете использовать.

Это похоже на принятый ответ. Но я бы рекомендовал переопределить метод рендеринга вBasePage и получая все ваши шаблоны из этого.

Используйте HttpModule или Global.asax и прикрепитеФильтр к объекту ответа. Для меня это имеет больше эстетического смысла, потому что "Фильтр" свойство должно помочь вам фильтровать вывод, который именно то, что вы хотите!

Кстати, как дела с Ektron до сих пор? Они сводят меня с ума наверняка!

Спасибо за ответ. Голосуй за усилия! Вещь BasePage неЭто действительно другое решение, но скорее дополнение к принятому. Но хорошая идея. Я думаю это'Всегда хорошая идея создать класс BasePage, из которого будет производиться вся ваша страница. Или может быть 2-3 в зависимости от типа страниц, которые у вас есть. Что касается HttpModule и фильтра, это здорово! Опять же, похоже на принятое решение, но логика для замен будет извлечена из страницы. Это было бы здорово, если бы тыделаю замены в более чем одном месте! Ницца! John Bubriski
Ах да ... Электрон ... Я лично неэто не нравится Весь продукт задом наперед. Их API ужасен и очень запутан. Весь продукт глючит, но код запутан, поэтому у вас нет надежды попытаться выяснить, что они пытались сделать. Их форумы поддержки неТ очень хорошо. Если ты'ищите новую CMS, я бы порекомендовал Kentico. По большей части, вы ненужно написать любой код. Но когда вы пишете код, их API просто великолепен! Единственное недовольство, которое я испытываю с Kentico, заключается в том, что их система кэширования сбивает с толку и по умолчанию не настроена разумным образом. John Bubriski
0

вы можете захотеть иметь HTML-литералы на своей странице, а затем вы можете просто заменить их соответствующим содержимым в событии Page_Load.

Это потребует от вас написания HTML-кода, в отличие от простого текста, но, похоже, вы вводите свой собственный код JavaScript или тому подобное, для чего это будет прекрасно работать.

1

До того, как это событие произойдет: •

 Объект Page вызывает EnsureChildControls для каждого элемента управления и для страницы.

 Каждый связанный с данными элемент управления, для которого установлено свойство DataSourceID, вызывает свой метод DataBind.

 Событие PreRender наступает для каждого элемента управления на странице.Используйте событие, чтобы внести окончательные изменения в содержимое страницы или ее элементов управления.

Я считаю, что это последнее место, где вы могли бы сделать что-то подобное. Следующее событиеSaveStateComplete, который согласно документации имеет такое поведение:

До этого события ViewState был сохранен для страницы и для всех элементов управления.Любые изменения на странице или элементах управления на этом этапе будут игнорироваться. Используйте это событие для выполнения задач, которые требуют сохранения состояния просмотра, но не вносят никаких изменений в элементы управления.

Похожие вопросы