2010-11-09 7 views
161

so se questo stava accadendo nel PR o beta, ma se creo un metodo di estensione su HtmlHelper, non è riconosciuto in una pagina del rasoio alimentato:Razor HtmlHelper estensioni (o altri spazi dei nomi per le viste) non trovato

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

ho aggiunto alla sezione <Namespaces> in Web.config:

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

Ma getta un errore di compilazione quando si tenta di visualizzare la pagina:

@Html.Foo() 

Se si ricrea la pagina con WebForms funziona correttamente. Qual è l'accordo?

Soluzione

Se includo @using SomeNamespace.Extensions a mio avviso rasoio, allora funziona, ma mi piacerebbe molto piuttosto semplicemente avere in Web.config

+2

Anche la soluzione alternativa non funziona per me. Il metodo di estensione verrà visualizzato in intelliSense, ma genera un errore di compilazione durante il runtime. – Clark

+0

+1 per la soluzione alternativa. Lo preferisco nel mio caso. – Kent

+0

L'uso della soluzione alternativa è ok per una singola vista. Ma per più viste la gestione del codice diventa un problema. – Rahatur

risposta

266

Dal momento che la Beta, rasoio usa una sezione di configurazione diversa per definizione globale delle importazioni di spazio dei nomi. Nel file Views\Web.config si dovrebbe aggiungere il seguente:

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

Utilizzare la MVC 3 upgrade tool per garantire automaticamente di avere i valori di configurazione di destra.

Nota che potrebbe essere necessario chiudere e riaprire il file per le modifiche da prelevare dall'editor.

+0

Bingo. Grazie! Sai se è così che funzionerà o cambierà in RTM? – swilliams

+0

@swilliams A questo punto c'è una probabilità molto bassa che potremmo cambiare questo. Certamente funzionerà allo stesso modo in RTM. – marcind

+0

E come funzionerebbe con le Aree, se voglio condividere uno spazio dei nomi con tutte le mie Aree? Con il vecchio motore posso aggiungere i miei spazi dei nomi nella root web.config, che si occupa di questo, ma come funzionerebbe con Razor? – Gidon

-5

Poiché ASP.NET MVC 3 RTM è disponibile, non è necessaria la sezione di configurazione per Razor. E queste sezioni possono essere rimosse in sicurezza.

+3

MichaelvR, sì è stato un mio errore. Mi dispiace che tu sia entrato in confusione. – nick4eva

+0

Questo vale anche per un progetto MVC con alimentazione VB? Non ho accesso ai miei metodi di estensione ... http://stackoverflow.com/questions/4789273/net-mvc3-razor-vb-extensions-not-imported-in-view – Ropstah

+0

Questa risposta è sbagliata. Queste voci di configurazione sono ancora richieste. I nuovi modelli di progetto li hanno già ma se si sta aggiornando un'applicazione di Mvc 2 è necessario aggiungerli. – marcind

11

Come la risposta accettata suggerisce è possibile aggiungere "utilizzando" a tutte le viste aggiungendo alla sezione del file di configurazione.

Ma per una singola vista si potrebbe utilizzare

@using SomeNamespace.Extensions

2

ho trovato che mettere questa sezione nel mio web.config per ogni cartella vista risolto.

<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

In realtà ho trovato che per qualche motivo ROOT web.config aveva un reindirizzamento vincolante che stava causando il mio problema (in particolare, indicando '0.0.0.0-2.0.0.0' a' 1.0.0.0'), e '/ View/web Il file .config' non lo sovrascrive. (Inoltre, non credo che ne abbiate bisogno in ogni '/ View/Sottocartella /') – JoeBrockhaus

5

Ho avuto lo stesso errore in un'applicazione MVC 4 che utilizza Razor. Nel tentativo di ripulire i file web.config, ho rimosso i due webpages: valori di configurazione:

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

Una volta ho ripristinato questi valori di configurazione, le pagine sarebbero corretta compilazione e gli errori per quanto riguarda il metodo di estensione .Partial() scomparso.

+0

Questo in combinazione con la risposta di marcind ha aiutato a risolvere i miei problemi ... – Matze

5

ho avuto questo problema in VS 2015. Il seguente lo ha risolto per me:

Individuare "pagine Web: Versione" nelle app e aggiornarlo alla versione 3.0.0.0. Il mio web.config aveva

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

e ho aggiornato a

<add key="webpages:Version" value="3.0.0.0" /> 
1

Questo errore ti dice che non si ha il motore rasoio correttamente associato con il progetto.

Soluzione: nella finestra Esplora soluzioni, fare clic con il pulsante destro del mouse sul progetto Web e selezionare "Gestisci pacchetti Nuget ...", quindi installare "Rasoio Microsoft ASP.NET". Ciò assicurerà che sia installato correttamente il pacchetto e aggiungerà le voci necessarie nel tuo file web.config.

Problemi correlati