6

无论我尝试多少次,我的 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. 选择任何剃须刀视图文件,然后键入@Html.Display-,您将看到扩展方法未显示。

  7. 添加到剃刀视图文件@Imports TestProject.Extensions,然后保存并关闭文件。

  8. 重新打开文件,然后输入@Html.Display- 你会看到扩展方法没有出现。

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

我已经为此奋斗了好几个星期了。我在这里和其他地方找到的所有答案都没有帮助。一定有人有答案。

4

2 回答 2

10

确保在命名空间前加上应用程序名称。因此,例如,如果您创建的应用程序在您的应用程序中被调用MvcApplication1,您~/Views/web.config应该输入:

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

而不仅仅是:

<add namespace="TestProject.Extensions"/>

是的,我猜,它是那些 VB.NET 的东西之一 :-) 哦,不要忘记在对~/Views/web.config文件进行更改后关闭并打开 Razor 视图,否则您的更改将不会立即被考虑到(如果您运行应用程序,它当然会工作)。

于 2013-02-06T06:45:48.943 回答
4

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

对我来说,我发现我的“模块”类没有被明确地修改为“公共”(当你没有指定修饰符时,默认是朋友,这就是杀死我的原因)

是的,我意识到 OP 的示例模块已经被声明为 Public .. 但是,我只是没有在我自己的代码堆栈中抓住它,并认为我会强调这个要求。作为过去五年不得不玩 VB.Netter 的本地 C-sharper,我厌倦了手动翻译 C# 片段……并且倾向于依赖代码转换器。所以,我找到并转换的漂亮的 HtmlHelper 并没有完全正确,我忽略了在为我生成的代码片段中寻找这个问题。

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

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

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

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

  • 尽管我很鄙视它(出于类似的原因),但我会说,如果您有足够的决心去解决它,那么一切似乎都得到了支持。(感谢 StackOverflow!)

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

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

于 2013-12-11T17:58:29.717 回答