2010-11-09 30 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文件中。