代码之家  ›  专栏  ›  技术社区  ›  Jason Kresowaty

拦截ASP.NET控件oninit

  •  1
  • Jason Kresowaty  · 技术社区  · 15 年前

    我想拦截 OnInit 页面上的(多个)控件。其目的是在运行时设置控件的各种属性。截获发生在 ViewState 跟踪控件,因为所讨论的属性值不会存储在 对象 (为了节省空间)。

    有许多简单的技术可以在运行时设置属性,但它们不能满足我的需要,因为它们发生在 对象 跟踪 Control 开始。(这种技术的一个例子是在 Page 的控制树 奥尼特 方法。太晚了,因为 对象 控件添加到树中时,已开始跟踪。)

    我几乎找到了一个完美的解决方案。我在一个 .browser 文件:

    <browsers>
        <browser refID="Default">
            <controlAdapters>
                <adapter controlType="System.Web.UI.WebControls.WebControl" adapterType="TestClassLibrary.TestWebControlAdapter, TestClassLibrary"/>
            </controlAdapters>
        </browser>
    </browsers>
    

    以下是的源代码 TestWebControlAdapter :

    using System;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.Adapters;
    
    namespace TestClassLibrary
    {
        public class TestWebControlAdapter : WebControlAdapter
        {
            protected override void OnInit(EventArgs e)
            {
                if (this.Control is Button)
                {
                    ((Button)this.Control).Text = "Test Adapter";
                }
    
                base.OnInit(e);
            }
        }
    }
    

    我看到的问题是适配器无法堆叠,因此这将覆盖可能应用于此控件的任何其他适配器。

    有什么更好的办法来解决这个问题吗?注意,虽然它可以工作,但我考虑实际上添加一个 Init 中的事件处理程序 使标记中的所有控件都过多,并需要更通用的解决方案。

    1 回复  |  直到 15 年前
        1
  •  0
  •   Noon Silk    15 年前

    比你想要的略多,但也许 PostSharp 对你来说很有趣。你可能会用它来钩住这个事件。