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

时间:2008-08-28 19:11:34

标签: c# asp.net vb.net custom-server-controls web-controls

我正在开发一个扩展另一个控件的Customer Server Control。附加到表单上的其他控件没有问题。

在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")

找不到该方法,因为它不是Page的一部分。我应该在哪里看?我很确定这是可能的,因为我已经看到其他控件类似。


我忘了提及,我的解决方法是提供控制事件并将其附加到代码隐藏中。

5 个答案:

答案 0 :(得分:2)

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

VB.NET

<Browsable(True)> Public Event InitializeStuffCallback

C#

[Browsable(true)]
public event EventHandler InitializeStuffCallback;

参考: Design-Time Attributes for ComponentsBrowsableAttribute Class

所有事件,属性或任何需要在控件的代码隐藏中使用browsable属性来生成它,以便您可以在标记代码中更改它。

答案 1 :(得分:2)

通常你不需要通过反射获得方法。在你的用户控件中,定义一个公共事件(抱歉,我不知道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">

答案 2 :(得分:0)

您的解决方法实际上是更好的答案。如果您的代码必须在控件生命周期的某个部分运行,那么应该公开事件,让容器使用自定义功能延长生命周期。

答案 3 :(得分:0)

每个ASP.NET页面都是自己的类继承自Page,如下所示:

class MyPage : Page

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

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

但......就像其他人所说的那样,这种情况就是事件的用途。

答案 4 :(得分:0)

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

[Browsable(true)]  

可让您在“属性”窗口中看到该属性。但是,事件没有出现,这对我没有任何影响。

我之前忽略的事实是,当您从标签引用控件时,它会准备结束。