2010-11-09 48 views
161

说不上来,如果这是在PR或Beta发生的事情,但如果我上HtmlHelper创建一个扩展方法,它不是在剃刀供电页确认:剃刀的HtmlHelper扩展(或其他名称空间视图)未找到

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重新创建页面,它工作正常。这是怎么回事?

解决方法

如果我包括我的Razor视图@using SomeNamespace.Extensions,然后它的工作原理,但我宁愿只是有它在Web.config

+2

即使解决方法不适用于我。扩展方法将在intelliSense中显示,但在运行时会引发编译错误。 – Clark 2010-11-15 16:44:30

+0

为@using解决方法+1。我比较喜欢它。 – Kent 2012-12-11 23:17:06

+0

@对于单个视图,可以使用解决方法。 但是对于多个视图,代码管理成为一个问题。 – Rahatur 2013-12-05 06:53:06

回答

266

公测以来,剃须刀采用了不同的配置部分全局定义命名空间导入。在你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自动确保你有合适的配置值。

注意您可能需要关闭并重新打开文件,以便更改由编辑选取。

+0

宾果。谢谢!你知道这是它总是如何工作,还是会在RTM中改变? – swilliams 2010-11-09 18:53:25

+0

@swilliams在这一点上,我们会改变这种情况的可能性非常低。它几乎可以肯定在RTM中以相同的方式工作。 – marcind 2010-11-09 19:31:45

+0

如果我想与所有区域共享一个命名空间,这将如何与区域一起工作?使用旧的引擎,我可以在根web.config中添加我的命名空间,这会照顾到这个问题,但是如何与Razor配合使用? – Gidon 2010-11-11 16:35:43

-5

由于ASP.NET MVC 3 RTM不存在,因此Razor不需要配置部分。这些部分可以安全地删除。

+3

MichaelvR,是的,这是我的错误。我很抱歉你输入了混乱。 – nick4eva 2011-01-18 10:54:26

+0

这也算一个VB动力MVC项目吗?我没有访问我的扩展方法... http://stackoverflow.com/questions/4789273/net-mvc3-razor-vb-extensions-not-imported-in-view – Ropstah 2011-01-25 02:55:51

+0

这个答案是错误的。这些配置条目仍然是必需的。新的项目模板已经有了它们,但是如果您要升级Mvc 2应用程序,则必须添加它们。 – marcind 2011-02-27 17:22:20

11

由于接受的答案建议您可以通过添加到配置文件的部分添加“使用”到所有视图。

但对于单一视图,你可以只使用

@using SomeNamespace.Extensions

2

我发现,把这个部分在我的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

我实际上发现,由于某种原因ROOT web.config有一个绑定重定向导致我的问题(特别是,指向'1.0.0.0'的'0.0.0.0-2.0.0.0'),'/ View/web .config'文件不会覆盖该文件。 (另外,我不相信你在每个'/ View/Subfolder /'中都需要它) – JoeBrockhaus 2013-09-04 20:48:50

5

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

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

一旦我恢复这些配置值,该页面会正确地编译和有关.Partial()扩展方法消失的错误。

+0

这与marcind的答案一起帮助解决了我的问题...... – Matze 2016-03-24 12:55:18

5

我在2015年VS有这个问题。 以下为我解决:

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

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

,我又把它更新到

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

这个错误告诉你,你没有正确地与项目相关的剃刀引擎。

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