从子控件

时间:2015-12-03 19:21:49

标签: asp.net vb.net user-controls

我有一个ASPX页面,它调用用户控件(ASCX)来呈现表单。该控件包括单击某个按钮时触发的代码隐藏,如下所示:

Protected Sub ClickControlButton(ByVal sender as Object, ByVal e as System.EventArgs)
    ' run some code
    ' need to put something here, which I'll explain below
    Response.Redirect(Request.RawUrl)
End Sub

(例如,让我们说这个控件叫做ChildControl.ascx。注意:Response.Redirect调用最终返回到父页面,因此当它触发时,它会有效地重新加载页面。)ChildControl.ascx是嵌入另一个我称之为ParentPage.aspx的表单中。

我需要这个sub来调用中的另一个子页面(让我们称之为ParentPage.aspx)代码隐藏一个由ParentPage.aspx继承的实例(请参阅下面的编辑说明< / em>),像这样:

Protected Sub SomeFunction()
    'run some more code
End Sub

重定向发生之前我需要这个名为的文件。所以,实际上,当所有的事情都说完了,我需要我的控制代码看起来像这样:

Protected Sub ClickControlButton(ByVal sender as Object, ByVal e as System.EventArgs)
    ' run some code
    SomeFunction()
    Response.Redirect(Request.RawUrl)
End Sub

但是,控件无法识别SomeFunction(),可能是因为它是受保护的Sub,而不是Public,( EDIT ),它是一个实例类。我试图避免将其更改为Public Sub。

我将如何处理此事?

提前致谢。 。

编辑:一位比我更了解这个系统的同事指出,我试图访问的方法不在ParentPage.aspx中,正如我之前提到的那样,但实际上是一个存储在单独的VB文件中的实例方法(但是,它可以通过从ParentPage.aspx继承来访问 - 为我原始问题中的混淆道歉)。因此,在这种情况下,反射是行不通的。

2 个答案:

答案 0 :(得分:1)

首先,确保使用对象浏览器确保父页面中的sub实际受到保护(在设置下拉图标中,单击Show Protected并确保该功能受到保护)。如果不是,您可能没有将页面对象强制转换为实际类型的对象,因此当您有Option Strict On时,intelisense不会检测到该方法。

如果它真正受到保护且无法访问,唯一的方法是使用Reflection来调用sub。

以下是System.Reflection的一些阅读材料

http://csharp.net-tutorials.com/reflection/introduction/

答案 1 :(得分:0)

在与同事协商后,我将该方法变为公共共享子。

唉!