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.