2010-10-06 7 views
143

C'è qualche tipo di magia che devo usare per ottenere gli spazi dei nomi nell'elemento pages/namespaces nel webconfig?Come aggiungere spazi dei nomi aggiuntivi alle pagine Rasoio invece di @using declaration?

<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 solo non vogliono lavorare. So che lo spazio dei nomi va bene perché quando metto lo @using MyCustomHelpers nella parte superiore della pagina funziona magicamente.

questo è così che posso ottenere il Html.SomeFunction() a lavorare senza dover mettere @using nella parte superiore di tutte le mie pagine

+1

che rilascio di MVC 3 stai usando? – marcind

+0

Stavo usando MVC 3 Preview 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

+0

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 sezione '' '' '' 'config dovrebbe già esistere in THAT Web.Config! –

risposta

160

Aggiornamento: si prega di dare un'occhiata alla mia risposta aggiornato che si applica a MVC 3 RC: Razor HtmlHelper Extensions (or other namespaces for views) Not Found

Questo è cambiato tra MVC 3 Anteprima 1 e MVC 3 Beta (uscito proprio oggi). In Preview 1 Razor ha utilizzato la sezione di configurazione dei namespace WebForms. Comunque nella Beta c'è una nuova sezione di configurazione che è separata da quella di WebForms. Sarà necessario aggiungere il follwing al 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> 

Nota che potrebbe essere necessario chiudere e riaprire il file per le modifiche essere raccolto dall'editore

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 file ~\View\Web.config che viene fornito nei modelli di progetto Beta.

+2

FWIW, ho trovato che è richiesto anche l'attributo 'pageBaseType =" System.Web.Mvc.WebViewPage "'. 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

50

se metti la tua dichiarazione di namespace nel Web.config nella radice "Viste" cartella e/o la cartella "Viste" dell'area corrente (a seconda di dove si trova la vista) - dovrebbe funzionare come previsto.

+6

Una soluzione molto migliore, grazie. –

+0

Funziona molto bene, grazie. – Wout

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

Fondamentalmente si può fare questo

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

e inserire il seguente codice nel tuo AssemblyInfo.cs

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

il metodo InitializeApplication verranno eseguiti prima Application_Start in global.asax

+0

Metodo spostato in System.Web.WebPages.Razor.WebCodeRazorHost.AddGlobalImport ("Fully.Qualified.Namespace"); – agrath

4

Per per quello che vale, un'altra tecnica è semplicemente mettere la tua classe di estensione helper in uno spazio dei nomi di sistema che è già incluso nel motore di visualizzazione di defaul t. Per esempio:

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

In questo modo, fino a quando la libreria contenente la classe viene fatto riferimento, tutto ciò che lo vedrà. Poiché si estende una classe System.Web.Mvc, sembra ragionevolmente accettabile inserire i metodi di estensione nello stesso spazio dei nomi.

Problemi correlati