HttpServerUtility包含一个名为UrlEncode的公共函数.它不是共享功能.HttpServerUtility没有任何公共构造函数.
这样做失败了:
Dim encodeMe As String = "a string to be encoded!"
HttpServerUtility.UrlEncode(encodeMe) 'Bombs out
Run Code Online (Sandbox Code Playgroud)
这是有效的,也是微软的说法:
Dim instance As HttpServerUtility
Dim encodeMe As String = "a string to be encoded!"
instance.UrlEncode(encodeMe ) 'Works!
Run Code Online (Sandbox Code Playgroud)
他们是如何做到这一点的?您无法使用构造函数实例化它的实例,但只能通过引用HttpServerUtility.UrlEncode来访问UrlEncode.
编辑:虽然我非常喜欢每个人进入一个大的OO辩论,我相信问题是错误的MSDN文档."Dim instance As HttpServerUtility"这一行应该是"Dim instance As HttpServerUtility = Context.Server"我包含的代码(来自MSDN文档)实际上不起作用,而是抛出一个空引用异常 - 就像你一样期待.谢谢你,杰森!
无论我尝试多少次,我都无法使用我的HTML Helper扩展方法.这是我创建的测试步骤,如果有人想自己尝试一下:
使用Visual Studio 2012,我使用"Internet应用程序"项目模板创建一个新的"Visual Basic ASP.NET MVC 4 Internet Web应用程序".
我创建了一个文件夹 "~/Views/Helpers"
我创建一个文件"DisplayForPropertyHelper.vb"并添加以下代码:
Namespace TestProject.Extensions
Public Module HtmlHelperExtensions
<Extension()>
Public Function DisplayForProperty(helper As HtmlHelper) As MvcHtmlString
Return MvcHtmlString.Create("TEST")
End Function
End Module
End Namespace
Run Code Online (Sandbox Code Playgroud)我打开"~/Views/Web.config"并更改以下内容(我添加扩展名称空间):
<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.Optimization"/>
<add namespace="System.Web.Routing" />
<add namespace="TestProject.Extensions"/>
</namespaces>
</pages>
</system.web.webPages.razor>
Run Code Online (Sandbox Code Playgroud)编译项目
选择任何剃刀视图文件,然后键入@Html.Display- 您将看到扩展方法未显示.
添加到剃刀视图文件,@Imports TestProject.Extensions然后保存并关闭该文件.
重新打开文件,然后键入 …
vb.net extension-methods html-helper asp.net-mvc-4 visual-studio-2012
我有一个例程
public void SomeRoutine(List<IFormattable> list) { ... }
Run Code Online (Sandbox Code Playgroud)
然后我尝试调用这个例程
List<Guid>list = new List<Guid>();
list.Add(Guid.NewGuid());
SomeRoutine(list);
Run Code Online (Sandbox Code Playgroud)
并且它因编译时错误而失败.System.Guid实现了IFormattable,但我得到的错误是
无法从'System.Collections.Generic.List'转换为'System.Collections.Generic.List'
注意:如果您只使用Guids数组,则会出现相同的错误.泛型不是原因....
但!鉴于这种
public void SomeRoutine2(IFormattable obj) { ... }
Run Code Online (Sandbox Code Playgroud)
还有这个
Guid a = Guid.NewGuid();
SomeRoutine2(a);
Run Code Online (Sandbox Code Playgroud)
它汇编!所以问题是为什么?为什么我能够将Guid对象(实现IFormattable)传递给接受IFormattable对象的例程,但是当我尝试将其扩展到集合(通用列表,数组或其他任何东西)时,我得到了转换错误?
我有一段时间找到答案,我认为这将是最好的去处.