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

时间:2020-03-05 18:44:37  来源:igfitidea点击:

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

在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无关。我应该在哪里看?我相当确定这是可能的,因为我已经看到其他控件也做类似的事情。

我忘了提一下,我的解决方法是提供控制事件并将其添加到后面的代码中。

解决方案

回答

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

回答

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

VB.NET

<Browsable(True)> Public Event InitializeStuffCallback

C#

[Browsable(true)]
public event EventHandler InitializeStuffCallback;

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

所有事件,属性或者任何需要包含在带有browsable属性的控件的代码后面的东西,都可以使用,以便我们可以在标记代码中对其进行更改。

回答

通常,我们不需要通过反射获取方法。在用户控件内,定义一个公共事件(对不起,我不知道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">

回答

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

class MyPage : Page

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

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

但是...就像其他人所说的,这种情况是为了什么。

回答

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

[Browsable(true)]

使我们可以在"属性"窗口中查看属性。但是,该事件未显示,这对我没有影响。

我之前忽略的一件事是,当我们从标记中引用控件的even时,它会以On开头。