167 votes

Extensions Razor HtmlHelper (ou autres espaces de noms pour les vues) non trouvées

Je ne sais pas si cela se produisait dans le PR ou la Beta, mais si je crée une méthode d'extension sur HtmlHelper il n'est pas reconnu dans une page propulsé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 une erreur de compilation se produit lorsque l'on essaie d'afficher la page :

@Html.Foo()

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

Solution de rechange

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

2 votes

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

0 votes

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

0 votes

La solution de contournement de @using est acceptable pour une seule vue. Mais pour des vues multiples, la gestion du code devient un problème.

274voto

marcind Points 38002

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.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 3 pour s'assurer automatiquement que vous avez les bonnes valeurs de configuration.

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

0 votes

Bingo. Merci ! Savez-vous si c'est toujours comme ça que ça va fonctionner ou si cela va être modifié dans la RTM ?

0 votes

@swilliams A ce stade, il y a une très faible probabilité que nous changions cela. Il est presque certain que cela fonctionnera de la même manière dans la RTM.

0 votes

Et comment cela fonctionnerait-il avec les zones, si je veux partager un espace de nom avec toutes mes zones ? Avec l'ancien moteur, je peux ajouter mes espaces de noms dans le web.config de la racine, ce qui s'en occupe, mais comment cela fonctionnerait-il avec Razor ?

11voto

Paul Rowland Points 4045

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

Mais pour une vue unique, vous pouvez simplement utiliser

en utilisant SomeNamespace.Extensions

6voto

John Rasch Points 28874

J'ai eu cette même erreur dans une application MVC 4 utilisant Razor. En essayant de nettoyer les fichiers web.config, j'ai supprimé les deux fichiers 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 rétabli ces valeurs de configuration, les pages se compilent correctement et les erreurs concernant l'interface de l'utilisateur sont corrigées. .Partial() La méthode d'extension a disparu.

3voto

Joseph Morgan Points 21

J'ai trouvé que mettre cette section dans mon web.config pour chaque dossier de vue a résolu le problème.

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

En fait, j'ai découvert que, pour une raison quelconque, le web.config de la racine comportait une redirection de liaison qui était à l'origine de mon problème (en particulier, le pointage de l'adresse 0.0.0.0-2.0.0.0 a 1.0.0.0 ), et le /View/web.config ne l'emporte pas. (De plus, je ne pense pas que vous en ayez besoin dans chaque fichier /View/Subfolder/ )

1voto

user782688 Points 11

J'ai rencontré le même problème (MVC 3 ; v4.0.30319) . Aucune solution n'a fonctionné pour moi. J'ai toujours eu le CS0246-erreur (Le nom de type ou d'espace de nom XXX n'a pas pu être trouvé) pendant l'exécution bien que mon assemblage ait été référencé. La seule différence avec les exemples sur le web est que mon assembly est un fichier de type exe -fichier.

Pour un test, j'ai renommé l'assemblage en .dll et a rafraîchi la référence. Depuis ce moment, mon projet fonctionne sans erreur. Il n'y a plus d'erreurs et Intellisense fonctionne également.

Quelqu'un peut-il confirmer ce comportement ? Est-ce un bogue ou une caractéristique (peut-être pour des raisons de sécurité), que le référencement des assemblages exe ne fonctionne pas dans les fichiers Razor-View ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X