web-dev-qa-db-fra.com

Extensions Razor HtmlHelper (ou autres espaces de noms pour les vues) introuvables

Je ne sais pas si cela se passait dans le PR ou la Bêta, mais si je crée une méthode d'extension sur HtmlHelper, elle n'est pas reconnue dans une page alimentée par Razor:

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

Je l'ai ajouté à la section <Namespaces> dans Web.config:

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

Mais cela génère une erreur de compilation en essayant de voir la page:

@Html.Foo()

Si je recrée la page avec WebForms cela fonctionne bien. Quel est le problème?

Solution de contournement

Si j'inclus @using SomeNamespace.Extensions dans ma vue Razor, alors cela fonctionne, mais je préférerais de beaucoup l'avoir dans Web.config

166
swilliams

Depuis la version bêta, Razor utilise une section de configuration différente pour définir globalement les importations d'espace de nom. Dans votre fichier Views\Web.config, vous devez ajouter ce qui suit:

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

Utilisez le outil de mise à niveau de MVC pour vous assurer automatiquement que vous avez les bonnes valeurs de configuration.

Remarque Il se peut que vous deviez fermer et rouvrir le fichier pour que les modifications soient prises en compte par l'éditeur.

273
marcind

Comme le suggère la réponse acceptée, vous pouvez ajouter "using" à toutes les vues en ajoutant une section du fichier de configuration.

Mais pour une vue unique, vous pouvez simplement utiliser

@ en utilisant SomeNamespace.Extensions

11
Paul Rowland

J'ai eu cette même erreur dans une application MVC 4 utilisant Razor. Pour tenter de nettoyer les fichiers web.config, j'ai supprimé les deux valeurs de configuration webpages::

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

Une fois que j'ai restauré ces valeurs de configuration, les pages se compileraient correctement et les erreurs concernant la méthode d'extension .Partial() disparaissaient.

6
John Rasch

J'ai eu ce problème dans VS 2015. Ce qui suit l'a résolu pour moi:

Recherchez "pages Web: version" dans les paramètres d'applications et mettez-le à jour vers la version 3.0.0.0. Mon web.config avait

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

et je l'ai mis à jour pour

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

J'ai constaté que le fait de placer cette section dans mon Web.config pour chaque dossier de vue l'avait résolu.

<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>
3
Joseph Morgan

Cette erreur vous indique que le moteur de rasoir n'est pas correctement associé à votre projet.

Solution: Dans la fenêtre de l'Explorateur de solutions, cliquez avec le bouton droit de la souris sur votre projet Web et sélectionnez "Gérer les packages de nugets ...", puis installez "Microsoft ASP.NET Razor". Cela garantira que le paquet est correctement installé et qu'il ajoutera les entrées nécessaires dans votre fichier web.config.

1
user3459730

Dans mon cas, utilisez VS 2013 et ne supporte pas MVC 3 de manière native (même si vous modifiez ./Views/web.config): https://stackoverflow.com/a/28155567/1536197

0
Hernaldo Gonzalez