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


167

Je ne sais pas si cela se produisait 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 <Namespaces>section 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 lors de la tentative d'affichage de la page:

@Html.Foo()

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

solution de contournement

Si j'inclus @using SomeNamespace.Extensionsdans ma vue Razor, cela fonctionne, mais je préfère de loin l'avoir dansWeb.config


2
Même la solution de contournement ne fonctionne pas pour moi. La méthode d'extension apparaîtra dans intelliSense, mais génère une erreur de compilation lors de l'exécution.
Clark

+1 pour la solution de contournement @using. Je le préfère dans mon cas.
Kent du

@Utiliser la solution de contournement est acceptable pour une seule vue. Mais pour plusieurs vues, la gestion du code devient un problème.
Rahatur

Réponses:


274

Depuis la version bêta, Razor utilise une section de configuration différente pour définir globalement les importations d'espaces de noms. Dans votre Views\Web.configfichier, 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 l' outil de mise à niveau MVC 3 pour vous assurer automatiquement que vous avez les bonnes valeurs de configuration.

Notez que vous devrez peut-être fermer et rouvrir le fichier pour que les modifications soient prises en compte par l'éditeur.


1
Est-ce que je manque une référence d'assemblage? Il ne reconnaît pas System.Web.Mvc.WebViewPage ou l'un des types de la section configSections.
Clark

4
J'ai dû ajouter une référence à> System.Web.WebPages.Razor et cela l'a réglé.
TWith2Sugars

4
Ça ne fonctionne pas pour moi. J'utilise MVC 3 RC, j'ai ajouté mon espace de noms au web.config dans mon dossier vues. Je ne peux toujours pas voir mes extensions dans la page Razor. L'événement mettant @using <extensionname> ne fonctionne pas. @ TWith2Sugars Je ne trouve même pas System.Web.WebPages.Razor à ajouter, j'ai ajouté System.Web.Razor mais je n'ai pas aidé. Je suis vraiment coincé ici
freddoo

31
+1 pour m'avoir dit d'ouvrir et de fermer le fichier pour voir les mises à jour.
Amir

26
Merci de souligner que ce n'est pas le web.config racine, mais le web.config dans le dossier View!
G-Wiz

11

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

Mais pour une seule vue, vous pouvez simplement utiliser

@utilisation de SomeNamespace.Extensions


6

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 webpages:valeurs de configuration:

<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 .Partial()méthode d'extension disparaissaient.


5

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 de l'application 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" />

3

J'ai trouvé que mettre cette section dans mon web.config pour chaque dossier de vue le résolvait.

<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
En fait, j'ai trouvé que pour une raison quelconque, le web.config ROOT avait une redirection de liaison qui causait mon problème (en particulier, pointant 0.0.0.0-2.0.0.0vers 1.0.0.0), et le /View/web.configfichier ne remplace pas cela. (De plus, je ne pense pas que vous en ayez besoin dans tous /View/Subfolder/)
JoeBrockhaus

1

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

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



-6

Étant donné qu'ASP.NET MVC 3 RTM est disponible, il n'est pas nécessaire de créer une section de configuration pour Razor. Et ces sections peuvent être supprimées en toute sécurité.


Je me demande si c'est vrai, nick4eva. Si je crée une nouvelle application Web MVC 3 et que je choisis le moteur de visualisation Razor, le web.config, qui est présent dans le dossier Views, aura les configSections de rasoir par défaut. Si je les désactive, j'obtiendrai des erreurs de compilation au moment de l'exécution.
MichaelvR

3
MichaelvR, oui c'était mon erreur. Je suis désolé que vous soyez entré dans la confusion.
nick4eva

Cela compte-t-il également pour un projet MVC alimenté par VB? Je n'ai pas accès à mes méthodes d'extension ... stackoverflow.com/questions/4789273/…
Ropstah

Cette réponse est fausse. Ces entrées de configuration sont toujours requises. Les nouveaux modèles de projet les ont déjà mais si vous mettez à niveau une application Mvc 2, vous devrez les ajouter.
marcind
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.