【问题标题】:Razor HtmlHelper Extensions (or other namespaces for views) Not Found未找到 Razor HtmlHelper 扩展(或其他视图命名空间)
【发布时间】:2011-05-07 09:46:33
【问题描述】:

我不知道这是否发生在 PR 或 Beta 中,但如果我在 HtmlHelper 上创建扩展方法,则在 Razor 支持的页面中无法识别:

namespace SomeNamespace.Extensions {
    public static class HtmlExtensions {
        public static string Foo(this HtmlHelper html) {
            return "Foo";
        }
    }
}

我将它添加到Web.config<Namespaces> 部分:

<pages>
  <namespaces>
    <add namespace="System.Web.Mvc" />
    <!-- snip -->
    <add namespace="SomeNamespace.Extensions"/>
  </namespaces>
</pages>

但是在尝试查看页面时会抛出编译错误:

@Html.Foo()

如果我使用 WebForms 重新创建页面,它可以正常工作。有什么关系?

解决方法

如果我在我的 Razor 视图中包含 @using SomeNamespace.Extensions,那么它可以工作,但我宁愿只在 Web.config 中包含它

【问题讨论】:

  • 即使解决方法对我也不起作用。扩展方法将显示在 intelliSense 中,但在运行时会引发编译错误。
  • +1 用于@using 解决方法。我更喜欢它。
  • @using 解决方法对于单个视图来说是可以的。但是对于多个视图,代码管理成为一个问题。

标签: asp.net-mvc-3 extension-methods razor html-helper


【解决方案1】:

自 Beta 版以来,Razor 使用不同的配置部分来全局定义命名空间导入。在您的 Views\Web.config 文件中,您应该添加以下内容:

<configSections>
  <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
    <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
    <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
  </sectionGroup>
</configSections>

<system.web.webPages.razor>
  <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.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" />
      <!-- Your namespace here -->
    </namespaces>
  </pages>
</system.web.webPages.razor>

使用MVC 3 upgrade tool 自动确保您拥有正确的配置值。

请注意,您可能需要关闭并重新打开文件才能让编辑器获取更改。

【讨论】:

  • 我是否缺少程序集参考?它无法识别 System.Web.Mvc.WebViewPage 或 configSections 部分中的任何类型。
  • 我必须添加对 >System.Web.WebPages.Razor 的引用,然后它就解决了。
  • 这对我不起作用。我正在使用 MVC 3 RC ,我将命名空间添加到我的视图文件夹中的 web.config 中。在 Razor 页面中仍然看不到我的扩展。放置@using 的事件不起作用。 @ TWith2Sugars 我什至找不到要添加的 System.Web.WebPages.Razor,我添加了 System.Web.Razor 但没有帮助。我真的被困在这里了
  • +1 告诉我打开和关闭文件以查看更新。
  • 感谢您指出这不是根web.config,而是View文件夹中的web.config!
【解决方案2】:

正如公认的答案所暗示的,您可以通过添加到配置文件的部分来将“使用”添加到所有视图。

但是对于单个视图,您可以使用

@using SomeNamespace.Extensions

【讨论】:

    【解决方案3】:

    我在使用 Razor 的 MVC 4 应用程序中遇到了同样的错误。为了清理 web.config 文件,我删除了两个 webpages: 配置值:

    <appSettings>
      <add key="webpages:Version" value="2.0.0.0" />
      <add key="webpages:Enabled" value="false" />
    

    一旦我恢复了这些配置值,页面就会正确编译,并且关于 .Partial() 扩展方法的错误消失了。

    【讨论】:

      【解决方案4】:

      我在 VS 2015 中遇到了这个问题。 以下为我解决了它:

      在 appsettings 中找到“webpages:Version”并将其更新到版本 3.0.0.0。我的 web.config 有

      <add key="webpages:Version" value="2.0.0.0" />
      

      我将其更新为

      <add key="webpages:Version" value="3.0.0.0" />
      

      【讨论】:

        【解决方案5】:

        我发现将这个部分放在我的 web.config 中为每个视图文件夹解决了这个问题。

        <runtime>
                <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
                    <dependentAssembly>
                        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
                        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="4.0.0.0" />
                    </dependentAssembly>
                </assemblyBinding>
            </runtime>
        

        【讨论】:

        • 我实际上发现由于某种原因,ROOT web.config 有一个绑定重定向,这导致了我的问题(特别是,将0.0.0.0-2.0.0.0 指向1.0.0.0),而/View/web.config 文件没有覆盖它。 (另外,我不相信你在每个/View/Subfolder/ 中都需要它)
        【解决方案6】:

        此错误表明您没有将剃刀引擎与您的项目正确关联。

        解决方案:在解决方案资源管理器窗口中,右键单击您的 Web 项目并选择“管理 Nuget 包...”,然后安装“Microsoft ASP.NET Razor”。这将确保安装了正确的软件包,并将必要的条目添加到您的 web.config 文件中。

        【讨论】:

          【解决方案7】:

          在我的情况下,使用 VS 2013,它本身不支持 MVC 3(即使你们更改 ./Views/web.config):https://stackoverflow.com/a/28155567/1536197

          【讨论】:

            【解决方案8】:

            由于 ASP.NET MVC 3 RTM 已推出,因此 Razor 不再需要配置部分。并且可以安全地删除这些部分。

            【讨论】:

            • 我想知道这是不是真的,nick4eva。如果我创建一个新的 MVC 3 Web 应用程序并选择 Razor 视图引擎,则位于 Views 文件夹中的 web.config 将默认具有 razor configSections。如果我禁用它们,我会在运行时得到编译错误。
            • MichaelvR,是的,这是我的错误。很抱歉您输入混乱。
            • 这是否也适用于 VB 驱动的 MVC 项目?我无法访问我的扩展方法...stackoverflow.com/questions/4789273/…
            • 这个答案是错误的。这些配置条目仍然是必需的。新的项目模板已经有了它们,但如果您要升级 Mvc 2 应用程序,则必须添加它们。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-08
            • 2018-12-19
            • 1970-01-01
            • 2011-06-10
            • 2020-02-18
            • 1970-01-01
            相关资源
            最近更新 更多