3

如果“启用服务器”的 HTML 标记在 Web 表单中,像这样——

<p runat="server"/>

——我有什么办法可以附加到它的渲染上吗?我假设一旦他们有 runat="server",他们必须有某种生命周期。

我想将一些代码附加到任何启用的 HTML 标记的呈现中。因此,每当模板作者将 runat="server" 放在标签上时,我就可以捕获 PreRender(或其他任何东西)并执行一些代码。

可能的?

4

3 回答 3

2

这是使用适配器完成的。您创建一个可以发挥其魔力的软件,并将其关联到 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>");
        }
    }
}

我的高级适配器具有超脆弱的能力,可以围绕从 HtmlControl 派生的所有控件(带有 runat="server" 的 html-tags,包括 <form runat="server">)呈现具有内联样式的 div。您的适配器可以挂钩由控件触发的任何事件,因此这应该可以解决您的需求。

于 2010-12-30T18:23:21.317 回答
0

这是页面生命周期文章的链接。这是一条重要的信息。

如果您正在对其进行编码,那么您可以创建一个类并覆盖 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);
}

这应该使您能够在渲染之前检查每个控件。

于 2010-12-30T14:49:57.030 回答
0

我想这就是我要找的。它递归地迭代整个控件树,并在找到 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);
    }
}
于 2010-12-30T15:08:56.063 回答