3

我在 VB.NET 中有一个 Web 应用程序项目,并且正在尝试添加一个扩展方法以在视图中使用。

扩展名.vb

Imports System.Runtime.CompilerServices    
Namespace MyApp
    Public Module Extensions
        <Extension()> _
            Public Function GetValOrDefault(ByVal dict As Dictionary(Of String, String), ByVal key As String, ByVal defaultVal As String) As String
                    Dim val As String
                    If (dict.TryGetValue(key, val)) Then
                        Return val
                    End If
                Return defaultVal
            End Function
        End Module
End Namespace

查看.cshtml

@Code
    Dim msgs As Dictionary(Of String, String) = New Dictionary(Of String, String)
    msgs("Foo") = "Bar"
    Dim val As String = msgs.GetValOrDefault("Foo", "Bar")
End Code

但是,这不起作用,显示以下错误:

'GetValOrDefault' is not a member of 'System.Collections.Generic.Dictionary(Of String, String)'.

这是一个相当简单的扩展方法,我不确定为什么没有被采纳。还尝试添加一个更简单的扩展,只接受一个字符串并返回一个字符串,但问题相同,所以似乎没有选择扩展方法。

尝试编译,也没有运气。请注意,该模块与视图位于同一个项目中,但我认为这不会有任何区别(我在 C# 项目中这样做没有问题)。

是否有我遗漏的步骤或其他事情需要完成才能使其正常工作?

4

4 回答 4

3

这是一个老问题,但是,如果其他人也摸不着头脑,请确保检查包含扩展名的文件的 Build Action 是否设置为 Compile。经过两个小时安静地发疯并想知道为什么扩展程序只在某些地方有效,我意识到它被设置为内容。快速更改编译并且它起作用了。:)

于 2017-01-18T08:42:50.960 回答
0

您可以定义扩展的类型。我刚试了一下没有问题。

Public Module Extensions
 <Runtime.CompilerServices.Extension()> _
 Public Function GetValOrDefault(Of dict As Dictionary(Of String, String))(ByVal d As dict, ByVal key As String, ByVal defaultVal As String) As String
  Dim val As String = ""
  If (d.TryGetValue(key, val)) Then
   Return val
  End If
  Return defaultVal
 End Function
End Module
于 2013-08-23T19:02:07.593 回答
0

您是否在视图文件夹中的 web.config 中包含命名空间“MyApp”?

<system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="MyApp"/>
      </namespaces>
    </pages>
  </system.web.webPages.razor>

注意:添加到您的 web.config 后,您可能必须关闭并重新打开视图才能使扩展程序可用于 Intellisense。

另一种选择是将您的 MyApp 命名空间直接导入视图:@Import MyApp

于 2013-08-23T18:44:58.780 回答
0

对我来说,这是因为我的扩展方法依赖于我的调用项目不包含的引用。

这是通过静态调用导致 vs 出现错误的方法来实现的。引用所需的 dll 解决了该问题,并允许我将其称为扩展名。

于 2020-03-06T01:51:06.040 回答