Razor HtmlHelper Uzantıları (veya görünümler için diğer ad alanları) Bulunamadı


167

Bu PR veya Beta'da gerçekleşiyorsa Dunno, ancak bir uzantı yöntemi oluşturursam HtmlHelper, Razor destekli bir sayfada tanınmaz:

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

Bunu şu <Namespaces>bölüme ekledim Web.config:

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

Ancak sayfayı görüntülemeye çalışırken derleme hatası veriyor:

@Html.Foo()

Sayfayı WebForms ile yeniden oluşturursam iyi çalışır. Anlaşma ne?

Geçici çözüm

@using SomeNamespace.ExtensionsJilet görünümüme dahil edersem , işe yarıyor, ama sadeceWeb.config


2
Geçici çözüm bile benim için çalışmıyor. Uzantı yöntemi intelliSense'te görünecek, ancak çalışma zamanı sırasında bir derleme hatası veriyor.
— Clark

@ Kullanarak geçici çözüm için +1. Benim durumumda tercih ederim.
— Kent

@ kullanarak geçici çözüm tek bir görünüm için uygundur. Ancak çoklu görünümler için kod yönetimi bir sorun haline gelir.
— Rahatur

Yanıtlar:


274

Beta'dan bu yana Razor, ad alanı ithalatını global olarak tanımlamak için farklı bir yapılandırma bölümü kullanıyor. Senin içinde Views\Web.configdosyaya aşağıdakileri eklemek gerekir:

<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>

Doğru yapılandırma değerlerine sahip olduğunuzdan emin olmak için MVC 3 yükseltme aracını kullanın.

Düzenleyici tarafından yapılan değişikliklerin alınması için dosyayı kapatıp yeniden açmanız gerekebileceğini unutmayın .


1
Bir montaj başvurusu eksik mi? System.Web.Mvc.WebViewPage veya configSections bölümündeki türlerin hiçbirini tanımıyor.
— Clark

4
> System.Web.WebPages.Razor için bir başvuru eklemek zorunda kaldı ve dizildi.
— TWith2Sugars

4
Benim için çalışmıyor. MVC 3 RC kullanıyorum, görünümlerim klasöründeki web.config dosyasına ad alanımı ekledim. Uzantılarımı hala Razor sayfasında göremiyorum. @ <extensionname> işlevini kullanan etkinlik çalışmaz. @ TWith2Sugars Hatta System.Web.WebPages.Razor eklemek için bulamıyorum, ben System.Web.Razor ekledim ama yardımcı olmadı. Gerçekten burada takılıp
— freddoo

31
Güncellemeleri görmek için dosyayı açıp kapatmamı söyledi.
— Amir

26
Bunun kök web.config değil, Görünüm klasöründeki web.config olduğunu belirttiğiniz için teşekkür ederiz!
— G-Wiz

11

Kabul edilen yanıtın da belirttiği gibi, yapılandırma dosyasının bölümüne ekleyerek tüm görünümlere "kullanarak" ekleyebilirsiniz.

Ancak tek bir görünüm için

@using SomeNamespace.Extensions


6

Razor kullanan bir MVC 4 uygulamasında da aynı hatayı aldım. Web.config dosyalarını temizlemek için iki webpages:yapılandırma değerini kaldırdım :

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

Bu yapılandırma değerlerini geri yükledikten sonra sayfalar doğru şekilde derlenir ve .Partial()uzantı yöntemiyle ilgili hatalar ortadan kalkar.


5

VS 2015'te bu sorunu yaşadım. Aşağıdakiler benim için çözdü:

Appsettings'de "webpages: Version" ı bulun ve 3.0.0.0 sürümüne güncelleyin. Web.config dosyamda

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

ve ben güncelledim

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

3

Her bölüm için bu bölümü web.config dosyasına yerleştirmenin onu çözdüğünü fark ettim.

<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
Aslında nedense KÖK web.config (özellikle işaret benim soruna neden olan bir bağlayıcı yönlendirme olduğunu buldu 0.0.0.0-2.0.0.0için 1.0.0.0) ve /View/web.configdosyası bu geçersiz kılmaz. (Ayrıca, her şeye ihtiyacın olduğuna inanmıyorum /View/Subfolder/)
— JoeBrockhaus

1

Bu hata, projenizle düzgün bir şekilde ilişkilendirilmiş ustura motoruna sahip olmadığınızı gösterir.

Çözüm: Solution Explorer penceresinde web projenize sağ tıklayın ve "Nuget Paketleri Yönet ..." seçeneğini seçin ve ardından "Microsoft ASP.NET Razor" u yükleyin. Bu, düzgün paketin kurulu olduğundan emin olur ve gerekli girişleri web.config dosyanıza ekler.



-6

ASP.NET MVC 3 RTM dışarı olduğundan Razor için yapılandırma bölümüne gerek yoktur. Ve bu bölümler güvenle çıkarılabilir.


Bunun doğru olup olmadığını merak ediyorum, nick4eva. Yeni bir MVC 3 web uygulaması oluşturursam ve Razor viewengine'i seçersem, Views klasöründe bulunan web.config varsayılan olarak jilet yapılandırmalarına sahip olur. Onları devre dışı bırakırsam, çalışma zamanında derleme hataları alırım.
— MichaelvR

3
MichaelvR, evet bu benim hatamdı. Karışıklık içinde olduğunuz için üzgünüm.
— nick4eva

Bu aynı zamanda bir VB destekli MVC projesi için de geçerli mi? Uzantı yöntemlerime erişimim yok ... stackoverflow.com/questions/4789273/…
— Ropstah

Bu cevap yanlış. Bu yapılandırma girişleri yine de gereklidir. Yeni proje şablonları zaten bunlara sahiptir, ancak bir Mvc 2 uygulamasını yükseltiyorsanız bunları eklemeniz gerekir.
— marcind
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.