Razor HtmlHelper Extensions (o altri spazi dei nomi per le viste) non trovato


167

Non so se questo stesse accadendo nel PR o nella Beta, ma se creo un metodo di estensione su HtmlHelper, non viene riconosciuto in una pagina alimentata da Razor:

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

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

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

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

@Html.Foo()

Se ricreare la pagina con WebForms funziona benissimo. Qual è l'accordo?

Soluzione

Se includo @using SomeNamespace.Extensionsnella mia vista Razor, allora funziona, ma preferirei averloWeb.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,

+1 per la soluzione alternativa @using. Lo preferisco nel mio caso.
Kent,

@usare la soluzione alternativa è ok per una singola vista. Ma per più viste la gestione del codice diventa un problema.
Rahatur,

Risposte:


274

Dalla Beta, Razor utilizza una sezione di configurazione diversa per la definizione globale delle importazioni di spazi dei nomi. Nel tuo Views\Web.configfile è necessario aggiungere quanto segue:

<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 lo strumento di aggiornamento MVC 3 per assicurarsi automaticamente di avere i giusti valori di configurazione.

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


1
Mi manca un riferimento all'assemblaggio? Non riconosce System.Web.Mvc.WebViewPage o alcuno dei tipi nella sezione configSections.
Clark,

4
Ho dovuto aggiungere un riferimento a> System.Web.WebPages.Razor e l'ho risolto.
TWith2Sugars,

4
Non funziona per me. Sto usando MVC 3 RC, ho aggiunto il mio spazio dei nomi a web.config nella mia cartella delle viste. Non riesco ancora a vedere le mie estensioni nella pagina Razor. L'evento che mette @using <extensionname> non funziona. @ TWith2Sugars Non riesco nemmeno a trovare System.Web.WebPages.Razor da aggiungere, ho aggiunto System.Web.Razor ma non ho aiutato. Sono davvero bloccato qui
freddoo il

31
+1 per avermi detto di aprire e chiudere il file per vedere gli aggiornamenti.
Amir,

26
Grazie per aver sottolineato che questo non è il web.config di root, ma il web.config nella cartella Visualizza!
G-Wiz,

11

Come suggerisce la risposta accettata, puoi aggiungere "utilizzo" a tutte le viste aggiungendo alla sezione del file di configurazione.

Ma per una singola vista potresti semplicemente usare

@using SomeNamespace.Extensions


6

Ho avuto lo stesso errore in un'applicazione MVC 4 utilizzando 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 ripristinati questi valori di configurazione, le pagine si sarebbero compilate correttamente e gli errori relativi al .Partial()metodo di estensione sarebbero scomparsi.


5

Ho riscontrato questo problema in VS 2015. Di seguito è stato risolto per me:

Trova "pagine web: versione" nelle impostazioni delle app e aggiornalo alla versione 3.0.0.0. Il mio web.config aveva

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

e l'ho aggiornato a

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

3

Ho scoperto che la risoluzione di questa sezione nel mio web.config per ogni cartella di visualizzazione l'ha risolta.

<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
Io in realtà trovato che per qualche motivo il web.config ROOT aveva un reindirizzamento vincolante che stava causando il mio problema (in particolare, indicando 0.0.0.0-2.0.0.0a 1.0.0.0), e il /View/web.configfile non ignorare questo. (Inoltre, non credo che ne abbia bisogno in tutti /View/Subfolder/)
JoeBrockhaus

1

Questo errore ti dice che non hai il motore del rasoio correttamente associato al tuo 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". Questo assicurerà che sia installato il pacchetto corretto e che aggiungerà le voci necessarie al tuo file web.config.



-6

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


Mi chiedo se sia vero, nick4eva. Se creo una nuova applicazione Web MVC 3 e scelgo il viewengine Razor, web.config, che è presente nella cartella Views, avrà le impostazioni di configurazione del rasoio per impostazione predefinita. Se li disabilito, otterrò errori di compilazione in fase di esecuzione.
MichaelvR,

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

Ciò vale anche per un progetto MVC basato su VB? Non ho accesso ai miei metodi di estensione ... stackoverflow.com/questions/4789273/...
Ropstah

Questa risposta è sbagliata Queste voci di configurazione sono ancora richieste. I nuovi modelli di progetto li hanno già, ma se stai aggiornando un'applicazione Mvc 2 dovrai aggiungerli.
marcind
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.