【问题标题】:How to access controls and variables, across Class and Code-behind?如何跨类和代码隐藏访问控件和变量?
【发布时间】:2013-03-07 22:27:58
【问题描述】:

我有 ASP.NET 页面、它的代码隐藏和一个类文件:

  • Folder1/page.aspx(asp.net页面),它包含一个label
   <asp:Label runat="server" ID="Label1" Visible="false"></asp:Label>
  • Folder1/page.aspx.vb (code-behind),它像这样调用connection.vb:
    Dim x As New Connection
    Protected Sub button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles button1.Click
    x.checkusernameExists(TextBoxUsername.Text)
    ' I try to access `Boolean variable` Flag from Class file but I can't.
    End Sub
  • App_Code/connection.vb(我创建的一个类文件)
    Public Class Connection
       Public Sub checkusernameExists(ByVal username1 As String)
       Dim flag as Boolean
       ' I try to access here `Label1.text` & `Label1.visible` to work on it but I can't.
       End Sub
    End Class


我的问题

1 - 如何从ASP.NET page 中的Connection.vb 访问Label1

2 - 如何从Connection.vb 中的page.aspx.vb 访问Boolean variable(代码隐藏)

我真的陷入了困境。
谢谢。

【问题讨论】:

  • 好的,感谢您删除 C# 标签。

标签: asp.net vb.net class scope code-behind


【解决方案1】:

使用(公共)属性或方法参数。

您必须问自己:为什么负责连接(我假设是数据库)的类完全可以访问您的 GUI?不要将不同的层相互硬链接,否则您将无法单独使用它们。

我建议让连接类完成它的工作,而不是修改你的前端。相反,控制器(aspx 页面)应该管理它的 GUI 并调用连接类,使用返回值来确定下一步如何处理 Label

所以返回一个Boolean 来表明用户是否有效:

Public Class Connection
   Public Shared Function checkusernameExists(ByVal username1 As String)As Boolean
       Dim userExists As Boolean
       ' acces db to check if the username exists '
       Return userExists 
   End Sub
End Class

在您的页面中:

Protected Sub button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles button1.Click
    Dim userExists As Boolean = Connection.checkusernameExists(TextBoxUsername.Text)
    Label1.Visible = userExists 
    If Label1.Visible Then Label1.Text = "Hello again " & TextBoxUsername.Text
End Sub

【讨论】:

  • 非常感谢您的解释,真的很有意义。我也明白,我们可以使用公共共享函数并返回结果,而不是 get,set,然后按照您提到的那样在页面代码中处理结果。但是,该代码目前似乎对我不起作用,我可能错过了一些东西。我会回帖的。
【解决方案2】:

将标志设为属性并在 checkusernameExists 函数中设置此属性

 Public Class Connection

   Public Property  Flag as Boolean 
   Public Sub checkusernameExists(ByVal username1 As String)

    // set flag here
     Flag = True // or whateever value returned from the database
   ' I try to access here `Label1.text` & `Label1.visible` to work on it but I can't.
   End Sub
End Class

并在 page.aspx.vb 文件中访问此实例级属性

Dim x As New Connection
Protected Sub button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles button1.Click
x.checkusernameExists(TextBoxUsername.Text)
Label1.Visible= x.Flag;
' I try to access `Boolean variable` Flag from Class file but I can't.
End Sub

【讨论】:

  • 谢谢 Saurabh,这就是我如何从一个类中访问一个对象,通过使用属性而不是变量,没有你的帮助我无法知道。
【解决方案3】:

您可以使用函数返回值并将标签作为参数传递。

Public Function SaveChanges(ByRef Label1 As Label, ByVal username1 As String) As Boolean
{
    Return True
}

如果你将标签属性传递给函数而不是传递标签的对象会更好,因为它耦合了两个类。

【讨论】:

  • 不是访问表单级别控件的好方法会在 View 和 DataAccessLayer 之间创建间接依赖关系,这也违反了告诉不要问的概念。
  • 谢谢阿迪尔,我不太明白,你的意思是我可以在Class文件中使用一个Function并将其结果返回给代码隐藏文件中的Sub吗?就像蒂姆的回答一样?
猜你喜欢
  • 2017-06-27
  • 2016-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多