Comment ajouter des espaces de noms supplémentaires aux pages Razor au lieu de la déclaration @using?

146

pages/namespacesDois- je utiliser une sorte de magie pour obtenir les espaces de noms dans l' élément de la webconfig?

<pages>
    <namespaces>
        <add namespace="System.Web.Mvc"/>
        <add namespace="System.Web.Mvc.Ajax"/>
        <add namespace="System.Web.Mvc.Html"/>
        <add namespace="System.Web.Routing"/>
        <add namespace="System.Web.WebPages"/>
        <add namespace="System.Web.Helpers"/>
        <add namespace="MyCustomHelpers"/>
    </namespaces>
</pages>

Ce qui précède ne veut tout simplement pas fonctionner. Je sais que l'espace de noms est très bien parce que lorsque je mets le @using MyCustomHelpersen haut de la page, cela fonctionne comme par magie.

C'est pour que je puisse faire Html.SomeFunction()fonctionner le sans avoir à mettre @usingen haut de toutes mes pages

MonNomIsJob
la source
1
quelle version de MVC 3 utilisez-vous?
marcind
J'utilisais MVC 3 Preview, donc l'autre réponse a fonctionné pour moi et fonctionne toujours, même après la mise à niveau ... mais votre réponse semble plus appropriée pour la nouvelle version - vers laquelle je vais mettre à niveau sous peu. Dommage que je ne puisse pas accepter deux réponses.
MyNameIsJob
Cela ne ressort pas clairement des commentaires dans les réponses, mais dans MVC4, l'espace de noms doit être ajouté au fichier Web.Config dans le dossier \ Views, PAS à l'application Web.Config. La <system.web.webPages.razor>section de configuration devrait déjà exister dans THAT Web.Config!
Ben McIntyre

Réponses:

163

Mise à jour : veuillez consulter ma réponse mise à jour qui s'applique à MVC 3 RC: Razor HtmlHelper Extensions (ou autres espaces de noms pour les vues) non trouvés

Cela a changé entre MVC 3 Preview 1 et MVC 3 Beta (sorti juste aujourd'hui). Dans l'aperçu 1, Razor a utilisé la section de configuration des espaces de noms WebForms. Cependant, dans la bêta, il existe une nouvelle section de configuration distincte de celle des WebForms. Vous devrez ajouter le follwing à votre fichier web.config (ou simplement commencer avec un tout nouveau projet à partir du modèle):

<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>
  <pages pageBaseType="System.Web.Mvc.WebViewPage">
    <namespaces>
      <add namespace="MyCustomHelpers" />
    </namespaces>
  </pages>
</system.web.webPages.razor>

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

Notez qu'il y a d'autres changements à ce qui est requis dans web.config pour que Razor fonctionne dans MVC3 Beta. Il vaut donc mieux jeter un œil au ~\View\Web.configfichier fourni dans les modèles de projet Beta.

Marcind
la source
2
FWIW, j'ai trouvé que l' pageBaseType="System.Web.Mvc.WebViewPage"attribut est également requis. J'ai mis à jour votre réponse.
Portman
1
Est-ce la même façon que vous le feriez pour MVC 3 RC?
Clark
1
+1 MERCI. J'ai passé beaucoup trop de temps à essayer de trouver la réponse à ce problème aujourd'hui.
jessegavin
32
vous devrez probablement fermer et rouvrir le fichier .cshtml s'il ne fonctionne pas ou s'il donne une erreur
Simon_Weaver
1
@Simon oui, vous devez mettre à jour pour rouvrir le fichier. L'éditeur ne surveille actuellement pas les changements de web.config.
marcind
50

Si vous placez votre déclaration d'espace de noms dans le Web.configdossier racine «Views» et / ou le dossier «Views» de la zone actuelle (selon l'endroit où se trouve votre vue) - cela devrait fonctionner comme prévu.

Buildstarted
la source
6

J'ai trouvé ce http://weblogs.asp.net/mikaelsoderstrom/archive/2010/07/30/add-namespaces-with-razor.aspx qui explique comment ajouter un espace de noms personnalisé à toutes vos pages de rasoir.

Fondamentalement, vous pouvez faire ceci

using Microsoft.WebPages.Compilation;
public class PreApplicationStart
{
   public static void InitializeApplication()
   {
       CodeGeneratorSettings.AddGlobalImport("Custom.Namespace");
   }
}

et placez le code suivant dans votre AssemblyInfo.cs

[assembly: PreApplicationStartMethod(typeof(PreApplicationStart), "InitializeApplication")]

la méthode InitializeApplication sera exécutée avant Application_Start dans global.asax

k-dev
la source
Méthode déplacée vers System.Web.WebPages.Razor.WebCodeRazorHost.AddGlobalImport ("Fully.Qualified.Namespace");
agrath
4

Pour ce que cela vaut, une autre technique consiste simplement à placer votre classe d'extension d'assistance dans un espace de noms System qui est déjà inclus par le moteur de vue par défaut. Par exemple:

namespace System.Web.Mvc
{
    public static class HtmlHelper_MyExtensions
    {
        ...
    }
}

De cette façon, tant que la bibliothèque contenant la classe est référencée, tout la verra. Puisque vous étendez une System.Web.Mvcclasse, il semble raisonnablement acceptable de placer les méthodes d'extension dans le même espace de noms.

Peter
la source