【问题标题】:VB.Net: call sub from shared subVB.Net:从共享子调用子
【发布时间】:2016-08-28 21:08:13
【问题描述】:

我在网页上有一些 Ajax,它将一些数据提供给服务器端 VB.Net 方法。一旦数据在服务器端方法中,我需要调用另一个服务器端方法来使用我刚刚收集的数据。这是一个非常简化的示例:

' This method gets the input from the Ajax code on the web page.
<System.Web.Services.WebMethod> _
Public Shared Sub GetAwesome(VBInputText As String)
    Dim strTest As String = VBInputText
    ' Now that we have collected input from the user, 
    ' we need to run a method that does a ton of other stuff.
    DisplayAwesome(VBInputText)
End Sub

Protected Sub DisplayAwesome(AwesomeIn As String)
    ' The real app does a lot more than this.  For this example, it 
    ' just sets the text of a literal.
    litAwesomeResult.Text = AwesomeIn
End Sub

当然,在上面的示例中,DisplayAwesome(VBInputText) 给了我“无法引用实例成员...”错误。那么,现在可以从Public Shared Sub GetAwesome 调用Protected Sub DisplayAwesome 了吗?我希望与这种解决方案保持密切联系,因为它可以很好地与应用程序配合使用,因为它已经由另一位同事编写。

【问题讨论】:

  • GetAwesome()的声明中删除了共享

标签: asp.net vb.net asp.net-ajax


【解决方案1】:

不幸的是你不能这样做,因为页面方法DisplayAwesome被定义为Protected,你需要一个类的实例来访问Protected方法。但是另一个实例中的更改不会反映在当前 UI 中。您可以做的另一件事是将DisplayAwesome 设为共享,但这次您无法访问共享函数内的 UI 元素。

在这种情况下你可以做的事情是,将数据返回到被调用的方法(在前端)并在那里处理litAwesomeResult.Text

【讨论】:

  • 哦,是的,我试图避免这种情况。基本上,有一个名为doSave() 的巨大方法需要在获得Ajax 输入后运行。所以,我需要向页面写入一个值,然后运行大的doSave()
  • “由于页面方法 DisplayAwesome 被定义为受保护”应为“由于页面方法 DisplayAwesome 未定义为共享,因此您需要一个实例......”
  • 所以,我的解决方案将是我不想做的一点点,但它需要最少的重写。我们在页面上放置了一个隐藏按钮(呃),并连接了 doSave() 方法。当Ajax 函数接收成功时,我们使用JavaScript 点击调用doSave() 的按钮。我不喜欢它,但它有效。
  • 我想我可能会接受这个作为答案。这不是我想要的答案,但事实很重要。谢谢!
【解决方案2】:

使用表单类的名称调用 sub,如下所示:

FormName.DisplayAwesome(VBInputText)

在VB.Net中,可以通过默认实例名称为Form Class的共享方法调用非共享方法,因为默认实例是VB应用程序框架创建并管理的对象Form类型,当form已添加到项目中。

欲了解更多信息,请参阅:

VB.NET Default Form Instances

【讨论】:

  • 你不能这样做,因为它不是shared方法,你需要创建一个实例来访问该方法
  • 您可以通过其他共享方法做到这一点!你可以测试一下!
  • 你能解释一下它是如何实现的吗?
  • 如果我尝试这个,我可以引用 DisplayAwesome sub,但是引用的 litAwesomeResult 是 sub 为空。
  • @un-lucky 你可以在 dev 中测试它!