如果“启用服务器”的 HTML 标记在 Web 表单中,像这样——
<p runat="server"/>
——我有什么办法可以附加到它的渲染上吗?我假设一旦他们有 runat="server",他们必须有某种生命周期。
我想将一些代码附加到任何启用的 HTML 标记的呈现中。因此,每当模板作者将 runat="server" 放在标签上时,我就可以捕获 PreRender(或其他任何东西)并执行一些代码。
可能的?
如果“启用服务器”的 HTML 标记在 Web 表单中,像这样——
<p runat="server"/>
——我有什么办法可以附加到它的渲染上吗?我假设一旦他们有 runat="server",他们必须有某种生命周期。
我想将一些代码附加到任何启用的 HTML 标记的呈现中。因此,每当模板作者将 runat="server" 放在标签上时,我就可以捕获 PreRender(或其他任何东西)并执行一些代码。
可能的?
这是使用适配器完成的。您创建一个可以发挥其魔力的软件,并将其关联到 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。您的适配器可以挂钩由控件触发的任何事件,因此这应该可以解决您的需求。
这是页面生命周期文章的链接。这是一条重要的信息。
如果您正在对其进行编码,那么您可以创建一个类并覆盖 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);
}
这应该使您能够在渲染之前检查每个控件。
我想这就是我要找的。它递归地迭代整个控件树,并在找到 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);
}
}