证明我错了:VB.NET HtmlHelper 扩展方法无法在 MVC 4 和 VS 2012 中工作

问题描述 投票:0回答:3

无论我尝试多少次,我都无法让我的 HTML Helper 扩展方法发挥作用。 这是我创建的测试步骤,如果有人想自己尝试一下:

  1. 使用 Visual Studio 2012,我使用“Internet 应用程序”项目模板创建一个新的“Visual Basic ASP.NET MVC 4 Internet Web 应用程序”。

  2. 我创建一个文件夹

    "~/Views/Helpers"

  3. 我创建一个文件

    "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
    
  4. 我打开

    "~/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>
    
  5. 编译项目

  6. 选择任何 razor 视图文件,然后输入

    @Html.Display
    - 您将看到扩展方法没有显示。

  7. 添加到剃刀视图文件

    @Imports TestProject.Extensions
    ,然后保存并关闭文件。

  8. 重新打开文件,然后输入

    @Html.Display
    ——您将看到扩展方法没有显示。

  9. 您甚至可以尝试关闭VS2012并重新打开该项目。 不会有什么不同。

我已经与这个问题斗争了好几个星期了。 我在这里和其他地方找到的所有答案都没有帮助。 一定有人能给出答案。

vb.net asp.net-mvc-4 visual-studio-2012 extension-methods html-helper
3个回答
10
投票

确保您使用应用程序名称作为命名空间的前缀。例如,如果您创建的应用程序在您的

MvcApplication1
中名为
~/Views/web.config
,您应该输入:

<add namespace="MvcApplication1.TestProject.Extensions"/>

不仅仅是:

<add namespace="TestProject.Extensions"/>

是的,我想,这是 VB.NET 的其中之一:-) 哦,对

~/Views/web.config
文件进行更改后,不要忘记关闭并打开 Razor 视图,否则您的更改将不会被考虑在内立即(如果您运行该应用程序,它当然会起作用)。


4
投票

这并不是一个真正的答案,但我写在这里希望只是添加(一点)整体情况。

对我来说,我发现我的“模块”类没有被显式修改为“公共”(当您不指定修饰符时,默认为 Friend,这就是杀死我的原因)

是的,我意识到 O.P. 的示例模块已经声明为公共。但是,我只是没有在我自己的代码堆栈中捕获它,并认为我应该强调该要求。作为一个在过去五年里一直在玩 VB.Netter 的本地 C 语言专家,我厌倦了手动翻译 C# 代码片段..并且倾向于依赖代码转换器。因此,我发现并转换的漂亮的 HtmlHelper 并没有完全正确,我忽略了在为我生成的代码片段中寻找这个问题。

正如之前的评论中所指出的,我也想加入合唱团并声明以下内容:

  • 我正在做上述所有事情(所以我想,当我一遍又一遍地检查 O.P. 的清单时)

  • 我还发现为 VB.NET MVC 4 编写 HtmlHelpers 几乎是不可能的(直到今天)——需求似乎以如此脆弱的方式得到支持

  • 我也鄙视必须使用 VB.NET 来开发 MVC 站点(但是,我必须忍受它......这是我加入公司时继承的遗留代码的一部分)

  • 尽管我很鄙视它(出于这样的原因),但我会说,如果你有足够的决心去弄清楚,一切似乎都得到了支持。 (感谢 StackOverflow!)

在此发现之前,我认为它可能不起作用,因为我的应用程序名称中包含点(MyCorp.Web.WorkOrders)与(MvcApplication1)..但是,我的测试得出的结论是应用程序名称不是问题。不管你怎么命名,它都会起作用。

再次,正如@Darin已经指出的那样..您当然必须将解决方案名称(空格)作为“添加命名空间”声明的一部分包含在views/web.config中


0
投票

就我而言,我在另一个名为

HtmlHelper
的项目中引用了自定义帮助器类。

将其重命名为

CustomHtmlHelper
后,我的错误就消失了。不是同样的问题,但无论如何我想提一下,以防有人有和我一样的问题

假设

我的自定义助手的名称(在其他项目中)与

HtmlHelper
类中内置的 ASP 相同/冲突。

© www.soinside.com 2019 - 2024. All rights reserved.