关于c#:如何在asp.net中将方法名称传递给自定义服务器控件?

关于c#:如何在asp.net中将方法名称传递给自定义服务器控件?

How to pass method name to custom server control in asp.net?

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

在 vb.net 中:Parent.FindControl(TargetControlName)

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

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

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

类似(在 VB 中)

1
2
3
4
5
6
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")

找不到该方法,因为它不属于页面。我应该在哪里寻找?我很确定这是可能的,因为我看到其他控件也有类似的情况。

我忘了提一下,我的解决方法是在代码隐藏中提供控制事件并附加到它们。


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

1
public event EventHandler EventName;

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

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

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

1
c:MyCustomerControl id="MyCustomerControl" runat=server OnEventName="MyCustomerControl_MethodName"

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

VB.NET

1
Browsable(True) Public Event InitializeStuffCallback

C#

1
2
[Browsable(true)]
public event EventHandler InitializeStuffCallback;

参考:
组件和 BrowsableAttribute 类的设计时属性

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


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

1
[Browsable(true)]

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

我之前忽略的事实是,当您从标记中引用控件时,它会预先结束。


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

1
class MyPage : Page

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

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

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


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


推荐阅读