Bagaimana cara menambahkan spasi nama tambahan ke halaman Razor alih-alih @ menggunakan deklarasi?

146

Apakah ada semacam sihir yang perlu saya gunakan untuk mendapatkan ruang nama dalam pages/namespaceselemen di konfigurasi web?

<pages>
    <namespaces>
        <add namespace="System.Web.Mvc"/>
        <add namespace="System.Web.Mvc.Ajax"/>
        <add namespace="System.Web.Mvc.Html"/>
        <add namespace="System.Web.Routing"/>
        <add namespace="System.Web.WebPages"/>
        <add namespace="System.Web.Helpers"/>
        <add namespace="MyCustomHelpers"/>
    </namespaces>
</pages>

Di atas tidak mau bekerja. Saya tahu namespace baik-baik saja karena ketika saya meletakkan @using MyCustomHelpersdi bagian atas halaman itu berfungsi secara ajaib.

Ini agar saya bisa Html.SomeFunction()bekerja tanpa harus meletakkan @usingdi bagian atas semua halaman saya

MyNameIsJob
sumber
1
rilis MVC 3 mana yang Anda gunakan?
marcind
Saya menggunakan Pratinjau MVC 3 sehingga jawaban yang lain berfungsi untuk saya dan masih berfungsi, bahkan setelah memutakhirkan ... namun jawaban Anda tampaknya lebih sesuai untuk versi baru - yang akan segera saya tingkatkan. Sayang aku tidak bisa menerima dua jawaban.
MyNameIsJob
Tidak jelas dari komentar dalam jawaban, tetapi dalam MVC4, namespace perlu ditambahkan ke file Web.Config dalam folder \ Views, BUKAN aplikasi Web.Config. Bagian <system.web.webPages.razor>config seharusnya sudah ada di THAT Web.Config!
Ben McIntyre

Jawaban:

163

Pembaruan : silakan lihat jawaban saya yang diperbarui yang berlaku untuk MVC 3 RC: Razor HtmlHelper Extensions (atau ruang nama lain untuk dilihat) Tidak Ditemukan

Ini telah berubah antara MVC 3 Pratinjau 1 dan MVC 3 Beta (dirilis hari ini). Di Pratinjau 1 Razor menggunakan bagian konfigurasi namespace WebForms. Namun dalam Beta ada bagian konfigurasi baru yang terpisah dari yang WebForms. Anda perlu menambahkan follwing ke file web.config Anda (atau mulai saja dengan proyek baru dari templat):

<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>
  <pages pageBaseType="System.Web.Mvc.WebViewPage">
    <namespaces>
      <add namespace="MyCustomHelpers" />
    </namespaces>
  </pages>
</system.web.webPages.razor>

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

Perhatikan bahwa ada perubahan lain pada apa yang diperlukan di web.config untuk membuat Razor bekerja di MVC3 Beta sehingga Anda sebaiknya melihat ~\View\Web.configfile yang dikirimkan dalam templat proyek Beta.

marcind
sumber
2
FWIW, saya telah menemukan bahwa pageBaseType="System.Web.Mvc.WebViewPage"atribut tersebut juga diperlukan. Saya telah memperbarui jawaban Anda.
Portman
1
Apakah ini cara yang sama Anda lakukan untuk MVC 3 RC?
Clark
1
+1 TERIMA KASIH. Saya menghabiskan terlalu banyak waktu untuk mencari jawaban atas masalah ini hari ini.
jessegavin
32
Anda kemungkinan besar harus menutup dan membuka kembali file .cshtml jika itu tidak berfungsi atau memberikan kesalahan
Simon_Weaver
1
@Simon ya, Anda perlu memperbarui buka kembali file. Editor saat ini tidak melihat perubahan web.config.
marcind
50

Jika Anda meletakkan deklarasi namespace di Web.configfolder "Tampilan" root dan / atau "Tampilan" area saat ini (tergantung di mana tampilan Anda) - itu harus bekerja seperti yang diharapkan.

Dibangun kembali
sumber
6

Saya menemukan http://weblogs.asp.net/mikaelsoderstrom/archive/2010/07/30/add-namespaces-with-razor.aspx yang menjelaskan cara menambahkan ruang nama khusus ke semua halaman pisau cukur Anda.

Pada dasarnya kamu bisa membuat ini

using Microsoft.WebPages.Compilation;
public class PreApplicationStart
{
   public static void InitializeApplication()
   {
       CodeGeneratorSettings.AddGlobalImport("Custom.Namespace");
   }
}

dan letakkan kode berikut di AssemblyInfo.cs Anda

[assembly: PreApplicationStartMethod(typeof(PreApplicationStart), "InitializeApplication")]

metode InitializeApplication akan dijalankan sebelum Application_Start di global.asax

k-dev
sumber
Metode dipindahkan ke System.Web.WebPages.Razor.WebCodeRazorHost.AddGlobalImport ("Fully.Qualified.Namespace");
agrath
4

Untuk apa nilainya, teknik lain adalah dengan hanya menempatkan kelas ekstensi pembantu Anda di namespace Sistem yang sudah disertakan oleh mesin tampilan secara default. Sebagai contoh:

namespace System.Web.Mvc
{
    public static class HtmlHelper_MyExtensions
    {
        ...
    }
}

Dengan cara ini, selama pustaka yang berisi kelas direferensikan, semuanya akan melihatnya. Karena Anda memperluas System.Web.Mvckelas, tampaknya cukup masuk akal untuk meletakkan metode ekstensi di namespace yang sama.

Peter
sumber