找不到Razor HtmlHelper扩展(或其他视图名称空间)


167

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

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

我将其添加到的<Namespaces>部分中Web.config

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

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

@Html.Foo()

如果我使用WebForms重新创建页面,则效果很好。这是怎么回事?

解决方法

如果我将其包含@using SomeNamespace.Extensions在Razor视图中,则可以使用,但我宁愿将其包含在其中Web.config


2
即使解决方法对我也不起作用。该扩展方法将显示在intelliSense中,但在运行时会引发编译错误。
克拉克

+1表示@using解决方法。我更喜欢这种情况。
肯特

对于单个视图,可以使用@using解决方法。但是对于多个视图,代码管理成为一个问题。
Rahatur

Answers:


274

从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升级工具可自动确保您具有正确的配置值。

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


1
我是否缺少装配参考?它无法识别System.Web.Mvc.WebViewPage或configSections部分中的任何类型。
克拉克

4
我必须添加对> System.Web.WebPages.Razor的引用,并将其整理出来。
TWith2Sugars

4
它对我不起作用。我正在使用MVC 3 RC,将名称空间添加到了views文件夹中的web.config中。在Razor页面上仍然看不到我的扩展程序。@using <extensionname>放的事件不起作用。@ TWith2Sugars我什至找不到要添加的System.Web.WebPages.Razor,我添加了System.Web.Razor但没有帮助。我真的被
困在这里

31
+1告诉我打开和关闭文件以查看更新。
阿米尔(Amir)

26
感谢您指出这不是根web.config,而是View文件夹中的web.config!
G-Wiz

11

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

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

@using SomeNamespace.Extensions


6

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

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

恢复这些配置值后,页面将正确编译,有关.Partial()扩展方法的错误也消失了。


5

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

在应用设置中找到“网页:版本”,并将其更新为版本3.0.0.0。我的web.config有

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

我将其更新为

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

3

我发现将这一部分放在每个视图文件夹的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>

1
其实我发现,由于某些原因,根web.config有这引起了我的问题(具体指向一个绑定重定向0.0.0.0-2.0.0.01.0.0.0),以及/View/web.config文件不会覆盖。(而且,我不相信您每个人都需要它/View/Subfolder/
JoeBrockhaus

1

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

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



-6

由于没有ASP.NET MVC 3 RTM,因此Razor不需要配置部分。这些部分可以安全移除。


我不知道那是真的,nick4eva。如果我创建一个新的MVC 3 Web应用程序,并选择了Razor Viewengine,则Views文件夹中的web.config默认情况下将具有razor configSections。如果禁用它们,则在运行时会出现编译错误。
MichaelvR 2011年

3
MichaelvR,是的,这是我的错误。对不起,您陷入混乱。
nick4eva

这是否也适用于VB驱动的MVC项目?我有我的扩展方法...没有访问stackoverflow.com/questions/4789273/...
Ropstah

这个答案是错误的。这些配置条目仍然是必需的。新的项目模板已经具有它们,但是如果要升级Mvc 2应用程序,则必须添加它们。
marcind 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.