Come aggiungere altri spazi dei nomi alle pagine di Razor invece della dichiarazione @using?


146

C'è una sorta di magia che devo usare per ottenere gli spazi dei nomi pages/namespacesnell'elemento nel webconfig?

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

Quanto sopra non vuole funzionare. So che lo spazio dei nomi va bene perché quando metto il @using MyCustomHelpersin cima alla pagina funziona magicamente.

Questo è così che posso farlo Html.SomeFunction()funzionare senza dover mettere @usingin cima a tutte le mie pagine


1
quale versione di MVC 3 stai usando?
marcind

Stavo usando l'anteprima di MVC 3, quindi l'altra risposta ha funzionato per me e funziona ancora, anche dopo l'aggiornamento ... tuttavia la tua risposta sembra più appropriata per la nuova versione, che aggiornerò a breve. Peccato non posso accettare due risposte.
MyNameIsJob

Non è chiaro dai commenti nelle risposte, ma in MVC4, lo spazio dei nomi deve essere aggiunto al file Web.Config nella cartella \ Views, NON all'applicazione Web.Config. La <system.web.webPages.razor>sezione di configurazione dovrebbe già esistere in That Web.Config!
Ben McIntyre,

Risposte:


163

Aggiornamento : dai un'occhiata alla mia risposta aggiornata che si applica a MVC 3 RC: Razor HtmlHelper Extensions (o altri spazi dei nomi per le visualizzazioni) Non trovato

Questo è cambiato tra MVC 3 Preview 1 e MVC 3 Beta (rilasciato proprio oggi). Nell'anteprima 1 Razor ha utilizzato la sezione di configurazione degli spazi dei nomi di WebForms. Tuttavia nella Beta è presente una nuova sezione di configurazione separata da quella di WebForms. Dovrai aggiungere il seguente al tuo file web.config (o semplicemente iniziare con un nuovo progetto dal modello):

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

Si noti che potrebbe essere necessario chiudere e riaprire il file affinché le modifiche vengano rilevate dall'editor.

Si noti che ci sono altre modifiche a ciò che è richiesto in web.config per far funzionare Razor in MVC3 Beta, quindi sarebbe meglio dare un'occhiata al ~\View\Web.configfile fornito nei modelli di progetto Beta.


2
FWIW, ho scoperto che pageBaseType="System.Web.Mvc.WebViewPage"è richiesto anche l' attributo. Ho aggiornato la tua risposta.
Portman,

1
È lo stesso modo in cui lo faresti per MVC 3 RC?
Clark,

1
+1 GRAZIE. Ho passato troppo tempo a cercare di trovare la risposta a questo problema oggi.
jessegavin,

32
molto probabilmente dovrai chiudere e riaprire il file .cshtml se non funziona o non viene visualizzato un errore
Simon_Weaver

1
@Simon sì, è necessario aggiornare riaprire il file. Al momento l'editor non sta osservando le modifiche a web.config.
marcind

50

Se inserisci la dichiarazione dello spazio dei nomi nella Web.configcartella "Viste" principale e / o nella cartella "Viste" dell'area corrente (a seconda della posizione della vista), dovrebbe funzionare come previsto.


6

Ho trovato questo http://weblogs.asp.net/mikaelsoderstrom/archive/2010/07/30/add-namespaces-with-razor.aspx che spiega come aggiungere uno spazio dei nomi personalizzato a tutte le pagine del tuo rasoio.

Fondamentalmente puoi farlo

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

e inserisci il seguente codice in AssemblyInfo.cs

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

il metodo InitializeApplication verrà eseguito prima di Application_Start in global.asax


Il metodo è stato spostato in System.Web.WebPages.Razor.WebCodeRazorHost.AddGlobalImport ("Fully.Qualified.Namespace");
Agrath

4

Per quello che vale, un'altra tecnica è semplicemente quella di inserire la classe di estensione helper in uno spazio dei nomi di sistema che è già incluso dal motore di visualizzazione per impostazione predefinita. Per esempio:

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

In questo modo, fintanto che la libreria contenente la classe è referenziata, tutto lo vedrà. Poiché stai estendendo una System.Web.Mvcclasse, sembra ragionevolmente accettabile inserire i metodi di estensione nello stesso spazio dei nomi.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.