【问题标题】:VS 2017 / ASP.net - Global functions not being recognizedVS 2017 / ASP.net - 无法识别全局功能
【发布时间】:2017-05-09 15:07:48
【问题描述】:

我从 VS 2010 (VB) 一直跳到 VS 2017,这可能是一个错误。我已经报告了错误,这让我的速度变慢了。我最近担心的是访问一个我在 VS 2010 中从未遇到过问题的全局函数类。我已经报告了它并且它正在分类中,但我想确保自 2010 年以来的版本中没有发生任何变化,希望有人能告诉我。

基本上发生的情况是全局类,无论它是如何配置的,都不会被任何其他类识别。在表单类中包含引用会导致 IDE 将其标记为错误。例如 GlobalFunctions.vb 文档中的代码:

Public Class GlobalFunctions

    Public Function DecodeBase64(strEncoded As String) As String
        Dim byt As Byte() = Convert.FromBase64String(strEncoded)
        Return (System.Text.ASCIIEncoding.ASCII.GetString(byt))
    End Function

    Public Function EncodeBase64(strUnencoded As String) As String
        Dim byt As Byte() = System.Text.Encoding.UTF8.GetBytes(strUnencoded)
        Return (Convert.ToBase64String(byt))
    End Function
End Class

以及来自表单页面的调用方法:

If elemSetting.Attributes("name").Value = "LoginName" Then
    Session("MailLoginName") = globalfunctions.DecodeBase64(elemSetting.Attributes("value").Value)
End If

If elemSetting.Attributes("name").Value = "LoginPass" Then
    Session("MailLoginPass") = globalfunctions.DecodeBase64(elemSetting.Attributes("value").Value)
End If

这里的错误在 IDE 中被突出显示:

以及错误列表中的错误信息:

也请理解,我已经尝试了尽可能多的声明变体,例如“公共共享函数”,使调用子共享,将全局函数文档定义为类或模块等。没有任何效果。

我还尝试将 GlobalFunctions.vb 类放在项目的根目录和名为 App_Code 的目录中,正如网上一些博客文章中所建议的那样。

由于我在 VS 2010 中没有遇到过这样的问题,我认为这是 2017 年的一个错误,正如我所说,我已经报告了。但我想用比我自己更聪明的头脑来检查一下,看看我是否忽略了一些可能在 2010 年到 2017 年之间发生变化的事情。

如果我做错了什么,有人可以告诉我吗?或者也许向我重申这确实是一个错误?

谢谢!

【问题讨论】:

  • First GlobalFunction 是一个类,而不是该类的实例。因此,要使用类名直接调用这些方法,它们应该被标记为 Shared
  • 第二。类 GlobalFunctions 在不同的项目中吗?如果是,您是否检查过是否已进行了适当的参考并且是否有正确的进口?如果不是,页面和类是否使用相同的命名空间(并再次检查 Imports)?
  • @Steve 我认为这只是他没有创建他的类的实例。是的,完全同意共享
  • @Mederic 错误消息很清楚。从页面代码的角度来看,没有名为 GlobalFunctions 的类。这里缺少一些东西
  • @Steve 正如我所提到的,我尝试了几种方法来声明函数和类/模块,包括“共享”、“公共”等。我只是没有在这里全部展示它们,因为它会使消息混乱。

标签: asp.net vb.net visual-studio-2010 global-variables visual-studio-2017


【解决方案1】:

尝试删除并重新创建您的 GlobalFunction.vb,因为过去可能通过重命名它在项目中的任何地方都没有正确更正。

我认为这很正常。您使用的是Class 而不是Module,因此您需要声明一个新实例,或者像这样调用:

Dim Globaler As New GlobalFunctions
If elemSetting.Attributes("name").Value = "LoginName" Then
    Session("MailLoginName") = Globaler.DecodeBase64(elemSetting.Attributes("value").Value)
End If
If elemSetting.Attributes("name").Value = "LoginPass" Then
    Session("MailLoginPass") = Globaler.DecodeBase64(elemSetting.Attributes("value").Value)
End If

或者使用模块,你不需要声明一个新实例。

此外,如果仍然无法访问,您应该检查一下,您可能只是将文件包含在解决方案中,而没有将其包含到项目中

添加新类:

  • 解决方案资源管理器
  • 右键单击您的项目名称(在我的项目上方)
  • 添加

【讨论】:

  • 谢谢。正如我所提到的,我也尝试将其作为一个模块来执行,这就是我在 2010 年毫无问题地完成它的方式。我在这里使用 Class 是因为它似乎在博客中被更普遍地推荐。
  • 当然 Class 和 Module 有所区别,并且在某种程度上都有自己的优势,但是当您必须存储数据以创建自己的对象时,我会推荐 Classes。
  • 这里的问题是Page中的代码看不到名为GlobalFunctions的类。您的代码不会改变这一点。
  • @Mederic(更新)我按照您的建议尝试了,IDE 显示错误“未定义类型'GlobalFunctions'。”
  • @Mederic 感谢您的耐心等待,老兄!那行得通!就像我在聊天中说的那样,我无法想象它是如何搞砸的,但它一定有,因为现在一切都很好。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-02
  • 2021-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-22
  • 2019-08-01
相关资源
最近更新 更多