代码之家  ›  专栏  ›  技术社区  ›  oglester

如何在ASP.NET中将方法名传递给自定义服务器控件?

  •  1
  • oglester  · 技术社区  · 16 年前

    我正在开发一个客户服务器控件,它扩展了另一个控件。附加到窗体上的其他控件没有问题。

    在VB.NET中: Parent.FindControl(TargetControlName)

    我想将一个方法传递给ASPX标记中的控件。

    例如: <c:MyCustomerControl runat=server InitializeStuffCallback="InitializeStuff">

    所以,我尝试使用反射从父级访问给定的方法名。

    类似(在VB中)

    Dim pageType As Type = Page.GetType
    Dim CallbackMethodInfo As MethodInfo = pageType.GetMethod( "MethodName" )
    
    'Also tried 
    sender.Parent.GetType.GetMethod("MethodName")
    sender.Parent.Parent.GetType.GetMethod("MethodName")
    

    找不到该方法,因为它只是不在页面的一部分。我该去哪儿找?我相当肯定这是可能的,因为我已经看到其他的控件也有类似的功能。


    我忘记提了,我的工作是给出控制事件并在代码后面附加到它们。

    5 回复  |  直到 7 年前
        1
  •  2
  •   T.S.    7 年前

    如果希望能够在ASPX标记中传递方法,则需要使用 Browsable 事件代码中的属性。

    VB.NET

    <Browsable(True)> Public Event InitializeStuffCallback
    

    C.*

    [Browsable(true)]
    public event EventHandler InitializeStuffCallback;
    

    参考文献: Design-Time Attributes for Components BrowsableAttribute Class

    所有的事件、属性或任何需要在控件的代码后面的具有可浏览属性的东西,以便您可以在标记代码中更改它。

        2
  •  2
  •   Serhat Ozgel    16 年前

    通常,您不需要通过反射获得方法。在您的用户控件内,定义一个公共事件(抱歉,我不知道VB语法,因此这将是C)

    public event EventHandler EventName;
    

    现在,在ASPX页或用户控件的任何容器中,定义一个与事件处理程序匹配的受保护方法:

    protected void MyCustomerControl_MethodName(object sender, EventArgs e) { }
    

    现在,在标记内,可以使用

    <c:MyCustomerControl id="MyCustomerControl" runat=server OnEventName="MyCustomerControl_MethodName">
    
        3
  •  0
  •   Joel Martinez    16 年前

    你的解决方法实际上是更好的答案。如果您有必须在控件生命周期的某一部分运行的代码,则 应该 公开事件以允许容器使用自定义功能扩展生命周期。

        4
  •  0
  •   oglester    16 年前

    布约特和杰西·迪林都有一个可以接受的答案。

    [Browsable(true)]  
    

    允许您在“属性”窗口中查看属性。然而,这件事没有出现,这对我来说没有什么区别。

    我之前忽略的是这样一个事实,即当您引用一个控件时,它甚至从标签开始,准备工作就结束了。

        5
  •  0
  •   T.S.    7 年前

    每个ASP.NET页都是 它自己的类 继承自 Page 如:

    class MyPage : Page
    

    因此,要通过反射找到该方法,必须获得正确的类型,即存储页面代码的页面类的类型。

    我想您需要支持多个页面来实例化这个控件,因为我相信您可以通过反射找到任何页面实例的子类型,但是我不记得是如何实现的,但是您应该能够做到。

    但是…正如其他人所说,这种情况就是 事件 是为了。