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

swilliams
la source
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.

Marcind
la source
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

Paul Rowland
la source
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.

John Rasch
la source
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" />
Damian Green
la source
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>
Joseph Morgan
la source
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.

user3459730
la source
-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é.

nick4eva
la source
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