asp.net 如何在多个页和类之间共享代码

ybzsozfc  于 2023-03-20  发布在  .NET
关注(0)|答案(2)|浏览(138)

请原谅我根据论坛的规则做错了,但我不知道该怎么做。这是对下面链接中问题的修改。有一个回答接近答案,但不完全是。通过“评论”或“编辑”来解释太多了,所以我想我应该做一个新的帖子。
How to Share Code Between Pages and Classes
无论如何(修改)的问题。
我试图在多个代码隐藏页面和多个类之间共享代码,这些类使用Page类的对象和方法。简单的例子是使用“response”和“session”对象。然而,在我的真实的例子中,我将使用其他Page对象和方法(例如GridView、Panels等)。
我想将公共页面对象相关代码保存在多个共享类中,并在多个页面和类之间共享代码。
下面的例子是基于我之前的Albert的建议(几乎成功了......归功于他)。
当使用下面的代码时,我在尝试从 “Class1”调用“Class2_Procedure” 时收到错误“Object reference not set to an instance of an object”(对象引用未设置为对象的示例)。

第页示例。调用“Class1_Procedure”和“Class2_Procedure”有效。调用“Class1_Procedure_Calling_Class2_Procedure”无效。

Partial Class _default
    Inherits System.Web.UI.Page

    Dim MyClass1 As New Class1(Me)
    Dim MyClass2 As New Class2(Me)

    Private Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
        Response.Write("Default Page > Page_Load</br>")
        MyClass1.Class1_Procedure()
        MyClass2.Class2_Procedure()
        MyClass1.Class1_Procedure_Calling_Class2_Procedure()
    End Sub
End Class

类1。问题是当您从 *“Class1”调用 *“Class2_Procedure”时。

Public Class Class1
    Dim MyPage As Page

    Sub New(MePage As Page)
        MyPage = MePage
    End Sub

    Dim MyClass2 As New Class2(MyPage)

    Sub Class1_Procedure()
        MyPage.Response.Write("Class1 > Class1_Procedure</br>")
    End Sub

    Sub Class1_Procedure_Calling_Class2_Procedure()
        MyPage.Response.Write("Class1 > Class1_Procedure_Calling_Class2_Procedure</br>")
        MyClass2.Class2_Procedure()
    End Sub
End Class

类2。“Class2_Procedure”可以从主页调用,但问题是当您从 “Class1”调用“Class2_Procedure” 时。

Public Class Class2
    Dim MyPage As Page

    Sub New(MePage As Page)
        MyPage = MePage
    End Sub

    Sub Class2_Procedure()
        MyPage.Response.Write("Class2 > Class2_Procedure</br>")
    End Sub
End Class
kgsdhlau

kgsdhlau1#

你的问题是这个代码:

Public Class Class1

    Dim MyPage As Page

    Sub New(MePage As Page)
        MyPage = MePage

    End Sub

    Dim MyClass2 As New Class2(MyPage)

首先,你可能希望所有的全局作用域变量都在同一个地方(在顶部)。
第二个问题是,当您创建Class 1的示例时,公共变量将在那个时间点初始化。
因此,在“new”事件中,所有这些值都默认为它们的值-但是MyPage THEN在new事件中被设置。(这对于公共Class 2获取mypage来说似乎太晚了。(如果您将其转换为getter/setter,我认为它会这样工作。)
因此,如果你想在该类中“设置”一些公共成员(变量),你应该在new事件中这样做--特别是在你创建的类依赖于其他公共值的情况下(如果你使用“new”,你不能控制顺序)。
在class 1中对任何public remember使用new关键字在99%的情况下都是可以的,不是问题。
然而,当那个/那些变量(在这个例子中是一个类示例)也使用其他成员/变量时,你在这里没有太多的控制权。
因此,强制执行该问题,并确保MyPage是“肯定”设置,然后您就可以放心地创建class 2的新示例,这也需要Mypage引用。
所以,你需要这样写:

Dim MyPage As Page
Dim MyClass2 As Class2

Sub New(MePage As Page)

    MyPage = MePage
    MyClass2 = New Class2(MyPage)

End Sub

Sub Class1_Procedure()
    MyPage.Response.Write("Class1 > Class1_Procedure</br>")
  .etc. .etc...

换句话说,“new”关键字看起来是在Class 2拾取我的页面之前触发的。(或者更好地说,“can”拾取MyPage)

lvmkulzt

lvmkulzt2#

你必须首先在一个模块中创建代码或函数,然后,以你正在使用的形式导入模块或类,通常是windowsapplication.classname。

相关问题