Лучший способ перехватить контроль рендеринга - PullRequest
1 голос
/ 13 января 2011

У меня есть элемент управления, используемый в нашей CMS, и у нас нет исходного кода для него, я хотел бы изменить вывод этого элемента управления.

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

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

Спасибо

1 Ответ

4 голосов
/ 13 января 2011

Оберните его в пользовательский элемент управления:

public class MyCMSControl: CommercialCMSControl
{
    protected override void Render(HtmlTextWriter writer)
    {
        StringBuilder stringBuilder = new StringBuilder();
        StringWriter stringWriter = new StringWriter(stringBuilder );

        using (HtmlTextWriter myWriter = new HtmlTextWriter(stringWriter ))
        {
            base.Render(myWriter);

            string newOutput;
            // the original output is in stringBuilder, do whatever you want, and
            // put it in newOutput


            writer.Write(newOutput);
        }
    }
}

Если вы хотите иметь возможность манипулировать выводом в коде, специфичном для страницы, добавьте событие, например, как:

public delegate void OnRenderHandler(object sender, string originalOutput, HtmlTextWriter writer)
public OnRenderHandler OnRender;
...
/// before writer.Write above...
if (OnRender!=null) {
    OnRender(this,stringBuilder.ToString(),writer);
}

Чтобы сделать вашу пользовательскую версию доступной в конструкторе, вам нужно что-то в web.config

<pages>
  <controls>
    <add namespace="My.Control.Namespace" assembly="My.Control.Assembly" tagPrefix="MyControlsPrefix"/>
  </controls>
</pages>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...