我在VB.NET中有一个Web应用程序项目,我正在尝试在视图中添加一个扩展方法。
Extensions.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
View.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#项目中完成了这个没有问题)。
是否有一个步骤或其他我需要做的事情需要做才能让它发挥作用?
答案 0 :(得分:3)
这是一个老问题,但是,如果其他人也在摸不着头脑,请确保检查包含扩展名的文件的Build Action是否设置为Compile。经过两个小时的悄悄疯狂,并想知道为什么扩展只在某些地方工作,我意识到它被设置为内容。快速更改编译,它的工作原理。 :)
答案 1 :(得分:0)
您是否在views文件夹中的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
答案 2 :(得分: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
答案 3 :(得分:0)
对我来说,这是因为我的扩展方法依赖于调用项目不包含的引用。
这是通过静态调用方法而可见的,该方法导致vs引发错误。引用所需的dll可以解决此问题,并允许我将其称为扩展名。