如何将方法名称传递给asp.net中的自定义服务器控件?
-
09-06-2019 - |
题
我正在开发一个扩展另一个控件的客户服务器控件。附加到窗体上的其他控件没有问题。
在 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")
找不到该方法,因为它不属于页面。我应该去哪里寻找?我相当确定这是可能的,因为我已经看到其他控件做了类似的事情。
我忘了提及,我的解决方法是提供控制事件并在代码隐藏中附加到它们。
其他提示
通常您不需要通过反射获取该方法。在你的用户控件中,定义一个公共事件(抱歉我不知道 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">
您的解决方法实际上是更好的答案。如果您有必须在控件生命周期的某个部分运行的代码,您可以 应该 公开事件,让容器通过自定义功能扩展生命周期。
buyutec 和 Jesse Dearing 都有一个可以接受的答案。
[Browsable(true)]
让您可以在“属性”窗口中查看该属性。然而,该事件没有出现,这对我来说没有什么区别。
我之前忽略的事实是,当您甚至从标签引用控件时,它会预先结束 On。
每个 ASP.NET 页面都是 它自己的类 继承自 Page
如:
class MyPage : Page
因此,要通过反射找到该方法,您必须获得正确的类型,即存储页面代码的页面类的类型。
我想您需要支持多个页面才能实例化此控件,我相信您可以通过反射找到任何 Page 实例的子类型,但我不记得如何做到,但您应该能够做到。
但...就像其他人所说的那样,这种情况就是这样 事件 是给。