Ekstensi HtmlHelper Razor (atau ruang nama lain untuk tampilan) Tidak Ditemukan

167

Entah apakah ini terjadi dalam PR atau Beta, tetapi jika saya membuat metode ekstensi aktif HtmlHelper, itu tidak dikenali di halaman bertenaga silet:

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

Saya menambahkannya ke <Namespaces>bagian di Web.config:

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

Tapi itu melempar kesalahan kompilasi ketika mencoba melihat halaman:

@Html.Foo()

Jika saya membuat ulang halaman dengan WebForms itu berfungsi dengan baik. Apa masalahnya?

Penanganan masalah

Jika saya termasuk @using SomeNamespace.Extensionsdalam tampilan Razor saya, maka itu berfungsi, tetapi saya lebih suka memilikinyaWeb.config

swilliams
sumber
2
Bahkan solusi tidak berhasil untuk saya. Metode ekstensi akan muncul di intelliSense, tetapi melempar kesalahan kompilasi selama runtime.
Clark
+1 untuk pemecahan masalah @menggunakan. Saya lebih suka dalam kasus saya.
Kent
@menggunakan penyelesaian masalah adalah ok untuk satu tampilan. Tetapi untuk beberapa tampilan manajemen kode menjadi masalah.
Rahatur

Jawaban:

274

Sejak Beta, Razor menggunakan bagian konfigurasi yang berbeda untuk impor namespace yang didefinisikan secara global. Dalam Views\Web.configfile Anda, Anda harus menambahkan yang berikut:

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

Gunakan alat pemutakhiran MVC 3 untuk secara otomatis memastikan Anda memiliki nilai konfigurasi yang tepat.

Perhatikan bahwa Anda mungkin perlu menutup dan membuka kembali file agar perubahan dapat diambil oleh editor.

marcind
sumber
1
Apakah saya kehilangan referensi perakitan? Itu tidak mengenali System.Web.Mvc.WebViewPage atau salah satu tipe di bagian configSections.
Clark
4
Saya harus menambahkan referensi ke> System.Web.WebPages.Razor dan itu beres.
TWith2Sugars
4
Itu tidak bekerja untuk saya. Saya menggunakan MVC 3 RC, saya menambahkan namespace saya ke web.config di folder views saya. Masih tidak dapat melihat ekstensi saya di halaman Razor. Menempatkan acara menggunakan <extensionname> tidak berfungsi. @ TWith2Sugars Saya bahkan tidak dapat menemukan System.Web.WebPages.Razor untuk ditambahkan, saya menambahkan System.Web.Razor tetapi tidak membantu. Saya benar-benar terjebak di sini
freddoo
31
+1 memberi tahu saya untuk membuka dan menutup file untuk melihat pembaruan.
Amir
26
Terima kasih telah menunjukkan ini bukan root web.config, tetapi web.config di folder Lihat!
G-Wiz
11

Seperti jawaban yang diterima menyarankan Anda dapat menambahkan "menggunakan" ke semua tampilan dengan menambahkan ke bagian file konfigurasi.

Tetapi untuk satu tampilan Anda hanya bisa menggunakan

@menggunakan SomeNamespace.Extensions

Paul Rowland
sumber
6

Saya memiliki kesalahan yang sama dalam aplikasi MVC 4 menggunakan Razor. Dalam upaya untuk membersihkan file web.config, saya menghapus dua webpages:nilai konfigurasi:

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

Setelah saya mengembalikan nilai konfigurasi ini, halaman akan dikompilasi dengan benar dan kesalahan mengenai .Partial()metode ekstensi menghilang.

John Rasch
sumber
5

Saya memiliki masalah ini di VS 2015. Berikut ini yang menyelesaikannya untuk saya:

Temukan "halaman web: Versi" di pengaturan aplikasi dan perbarui ke versi 3.0.0.0. Web.config saya punya

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

dan saya memperbaruinya ke

<add key="webpages:Version" value="3.0.0.0" />
Damian Green
sumber
3

Saya menemukan bahwa menempatkan bagian ini di web.config saya untuk setiap folder tampilan menyelesaikannya.

<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>
Joseph Morgan
sumber
1
Saya benar-benar menemukan bahwa untuk beberapa alasan ROOT web.config memiliki pengalihan yang mengikat yang menyebabkan masalah saya (khususnya, menunjuk 0.0.0.0-2.0.0.0ke 1.0.0.0), dan /View/web.configfile tidak menimpanya. (Juga, saya tidak percaya Anda membutuhkannya di setiap /View/Subfolder/)
JoeBrockhaus
1

Kesalahan ini memberi tahu Anda bahwa Anda tidak memiliki mesin cukur yang terkait dengan proyek Anda.

Solusi: Di ​​jendela Solution Explorer klik kanan pada proyek web Anda dan pilih "Kelola Paket Nuget ..." lalu instal "Microsoft ASP.NET Razor". Ini akan memastikan bahwa paket yang benar diinstal dan itu akan menambahkan entri yang diperlukan ke file web.config Anda.

pengguna3459730
sumber
-6

Sejak ASP.NET MVC 3 RTM keluar tidak perlu untuk bagian konfigurasi untuk Razor. Dan bagian ini dapat dihapus dengan aman.

nick4eva
sumber
Saya bertanya-tanya apakah itu benar, nick4eva. Jika saya membuat aplikasi web MVC 3 baru, dan memilih Razor viewengine, web.config, yang ada di folder Views, akan memiliki konfigurasi silet secara default. Jika saya menonaktifkannya, saya akan mendapatkan kesalahan kompilasi saat runtime.
MichaelvR
3
MichaelvR, ya itu kesalahan saya. Maaf karena Anda masuk dalam kebingungan.
nick4eva
Apakah ini juga termasuk dalam proyek MVC bertenaga VB? Saya tidak memiliki akses ke metode ekstensi saya ... stackoverflow.com/questions/4789273/…
Ropstah
Jawaban ini salah. Entri konfigurasi ini masih diperlukan. Template proyek baru sudah memilikinya tetapi jika Anda meningkatkan aplikasi Mvc 2 Anda harus menambahkannya.
marcind