2009-10-16 4 views
10

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

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

UPDATE

Вот код, который я в настоящее время используют для достижения этой цели:

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); 
} 

ответ

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());); 
} 
+0

Да, это подходящее место, но возможно ли (и разумно) сбросить и прочитать поток? –

+1

вы никогда не «перезагружаете» поток, так как он еще не отправлен. Я не уверен, что его мудрый, нет, я просто ответил на вопрос lol – JustLoren

+0

Я использую этот метод прямо сейчас, но буду ждать, чтобы принять ответ, чтобы увидеть, есть ли лучшее решение. В основном я ... Позвольте странице писать во временный буфер. Измените буфер. Замените исходный буфер на измененный. –

1

Вы посмотрели событие PreRender в жизненном цикле?

Перед этим происходит событие:

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

• Каждый связанный с данными объект связанный с данными объект DataSourceID вызывает его метод DataBind .

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

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

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

0

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

+0

К сожалению, я не могу этого сделать, потому что эти «заполнители» будут внутри содержимого, которое будет отображаться внутри пользовательского элемента управления, которое я не могу коснуться. Поэтому к тому времени, когда это дойдет до меня, единственное, что я могу надеяться сделать, это посмотреть на визуализированный контент. –

+0

Извините, я пропустил «пользовательский контроль», мой плохой. Элементы управления пользователя также имеют события PreRender. Вы должны иметь возможность размещать общедоступные свойства в пользовательских элементах управления, которые могут быть установлены на странице, а затем пользовательские элементы управления выполняют подстановку. –

0

Похоже, что у вас могут быть литералы HTML на вашей странице, а затем вы можете просто заменить их соответствующим контентом на событие Page_Load.

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

5

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

Существует два подхода, которые вы могли бы использовать.

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

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

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

+0

Спасибо за ответ. Проголосуйте за усилия! The BasePage вещь на самом деле не совсем другое решение, но скорее дополнение к принятому. Но хорошая идея. Я думаю, что всегда полезно создать класс BasePage, из которого все ваши страницы. Или 2-3, в зависимости от типов страниц, которые у вас есть. Что касается HttpModule и фильтра, это здорово! Опять же, похоже на принятое решение, но логика для заметок будет извлечена из страницы. Это было бы здорово, если бы вы делали замены в более чем одном месте! Ницца! –

+0

О да ... Эктрон ... Мне лично это не нравится. Весь продукт задн-назад. Их API является уродливым и очень запутанным. Весь продукт неисправен, но код запутан, поэтому у вас нет надежды попытаться выяснить, что они пытались сделать. Их форумы поддержки не очень хороши. Если вы ищете новую CMS, я бы порекомендовал Kentico. По большей части вам не нужно писать какой-либо код. Но когда вы пишете код, их API потрясающий! Единственная проблема, с которой я столкнулся с Kentico, заключается в том, что их система кэширования запутанна и по умолчанию не настроена разумно. –

Смежные вопросы