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.