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

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

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

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

    在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 回复  |  直到 8 年前
        1
  •  2
  •   T.S.    8 年前

    如果你想在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    17 年前

    通常,你不需要通过反射来获取该方法。在用户控件中,定义一个公共事件(很抱歉,我不知道vb语法,所以这将在c#中)

    public event EventHandler EventName;
    

    现在,在aspx页面或用户控件的任何容器中,定义一个与EventHandler匹配的受保护方法:

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

    现在,在您的标记中,您可以使用

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

    你的解决方法实际上是更好的答案。如果你有必须在控件生命周期的某个部分运行的代码,你 本应 公开事件,让容器通过自定义功能扩展生命周期。

        4
  •  0
  •   oglester    17 年前

    buyutec和Jesse Dearing都有一个可以接受的答案。

    [Browsable(true)]  
    

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

    我之前忽略的一件事是,当你从标签中引用控件时,它的prep结束于On。

        5
  •  0
  •   T.S.    8 年前

    每一个ASP。NET页面是 自己的阶级 继承自 Page 如:

    class MyPage : Page
    

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

    我想你需要支持多个页面才能实例化这个控件。我相信你可以通过Reflection找到任何Page实例的子类型,但我不记得是怎么找到的,但你应该能够做到这一点。

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

    推荐文章