Can I automatically join the life cycle of ANY server-enabled HTML tag?

If the server-enabled HTML tag is included in the web form, for example:

<p runat="server"/>

- is there any way to link it to rendering? I assume that if they have runat = "server", they should have some kind of life cycle.

I would like to add some code to the rendering of any HTML tag that would be included. That way, whenever a template author puts runat = "server" in a tag, I can catch PreRender (or something else) and execute some code.

Possible?

+3
source share
3 answers

, , . , 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

- . , , , 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", < form runat = "server" > ). , , .

+2

. , .

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

This should give you the opportunity to test each control immediately before rendering.

0
source

Source: https://habr.com/ru/post/1782781/


All Articles