Можно ли автоматически прикрепить к жизненному циклу ЛЮБОЙ серверный тег HTML? - PullRequest
3 голосов
/ 30 декабря 2010

Если HTML-тег «с включенным сервером» находится в веб-форме, например:

<p runat="server"/>

, есть ли способ прикрепить его к визуализации?Я предполагаю, что как только у них будет runat = "server", у них должен быть какой-то жизненный цикл.

Я бы хотел прикрепить некоторый код к отображению HTML-тега any , который включен.Поэтому, когда автор шаблона помещает в тег runat = "server", я могу перехватить PreRender (или что-нибудь еще) и выполнить некоторый код.

Возможно?

Ответы [ 3 ]

2 голосов
/ 30 декабря 2010

Это сделано с помощью адаптеров. Вы создаете тот, который делает свое волшебство, и связывает его в файле браузера, содержащемся в App_Browsers.

Вот пример моего экспериментального App_Browsers / Default.browser

<browsers>
  <browser refID="Default">
    <controlAdapters>
      <adapter controlType="System.Web.UI.HtmlControls.HtmlControl"
               adapterType="App_Code.Adapters.HtmlControlAdapter" />
    </controlAdapters>
  </browser>
</browsers>

И мой адаптер ...

с использованием System.Web.UI; использование System.Web.UI.Adapters;

using System.Web.UI;
using System.Web.UI.Adapters;

namespace App_Code.Adapters {
    public class HtmlControlAdapter : ControlAdapter {
        protected override void Render(HtmlTextWriter writer) {
            writer.Write("<div style='background-color: #f00;'>");
            base.Render(writer);
            writer.Write("</div>");
        }
    }
}

Мой очень продвинутый адаптер с суперфрагментными способностями отображает div со встроенными стилями вокруг всех элементов управления, полученных из HtmlControl (html-теги с runat = "server", включая ). Ваш адаптер может подключиться к любому событию, вызванному элементом управления, поэтому это должно удовлетворить ваши потребности.

0 голосов
/ 30 декабря 2010

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

protected override void OnLoad(System.EventArgs e)
{
    base.OnLoad(e);
    BindTagProcessor(Page);
}

private void BindTagProcessor(Control control)
{
    foreach (Control childControl in control.Controls)
    {
        if (childControl is HtmlControl)
        {
            ((HtmlControl)childControl).PreRender += new EventHandler(MyTagProcessor);                   
        }
        BindTagProcessor(childControl);
    }
}
0 голосов
/ 30 декабря 2010

Вот ссылка на статью о жизненном цикле страницы . Это важная информация, которую нужно знать.

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

Если вы предпочитаете более общий подход, вы можете сделать то же самое, но на уровне страницы. Вы можете подключить OnPreRender на уровне страницы следующим образом:

private void Page_PreRender(object sender, System.EventArgs e)
{
    Page page = sender as Page;
    if (page != null)
    {
        page.Controls.Clear(); // Or do whatever u want with ur page...
    }
}

private void InitializeComponent()
{    
    // Handle the Page.PreRender event.
    this.PreRender += new System.EventHandler(this.Page_PreRender);
}

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

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