47 votes

Vous avez besoin que l'auto-complétion du moteur de vue rasoir fonctionne dans une bibliothèque de classes ?

Nous avons une architecture modulaire où nous avons des fichiers de vues (cshtml) dans un projet séparé (bibliothèque de classes). Comment pouvons-nous obtenir le la coloration syntaxique et L'autocomplétion fonctionne-t-elle lorsque le projet n'est pas un projet MVC ?

Veuillez noter que la bibliothèque de classes comprend des contrôleurs, des vues, des modèles, etc. Elle n'a simplement pas le web.config, global.asax, etc. qu'un projet mvc normal aurait.

L'intellisense fonctionne pour tout sauf pour le modèle si important : screenshot of model error

Avec MVC3 RTM, si vous survolez le modèle, vous pouvez maintenant obtenir un meilleur message d'erreur :

C:\...\Index.cshtml : ASP.NET runtime erreur : Il n'y a pas de fournisseur de compilation enregistré pour l'extension .cshtml'. Vous pouvez en enregistrer un dans la section section <compilation><buildProviders>. dans le fichier machine.config ou web.config. Assurez-vous qu'il possède un BuildProviderAppliesToAttribute qui comprend la valeur "Web" ou "All".

J'ai donc ajouté ceci :

<compilation>
    <assemblies>
      <add assembly="System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    </assemblies>
    <buildProviders>
      <add
         extension=".cshtml"
         type="System.Web.WebPages.Razor.RazorBuildProvider, System.Web.WebPages.Razor"/>
    </buildProviders>
  </compilation>

Ensuite, après avoir ajouté le fournisseur de build, ce message d'erreur apparaît :

C:\...\Index.cshtml : ASP.NET runtime erreur : Impossible de charger le fichier ou l'assemblage System.Web.WebPages.Razor' ou l'une de ses dépendances. ses dépendances. Le système ne peut pas trouver le fichier spécifié. ( C:\...\machine.config ligne 259)

0 votes

Avez-vous vérifié la boîte de dialogue Ouvrir avec pour vous assurer qu'elle utilise Razor Editor ? J'ai créé une application console, ajouté un fichier cshtml et la coloration syntaxique fonctionne. Intellisense ne semble pas fonctionner avec les fichiers de classe locaux, mais il semble fonctionner avec les références globales telles que system.

0 votes

Même problème. Placer Web.config dans le répertoire View (copié à partir de tout nouveau projet MVC3 RC) aide également. Mais ce n'est pas à 100%. IntelliSence ne peut pas voir mes types personnalisés.

0 votes

Oui, la coloration syntaxique fonctionne, mais pas l'intellisense.

49voto

Deepak Points 1303

Le webconfig de ce poste fonctionnera. Je l'ai copié ci-dessous (pour la postérité) :

<?xml version="1.0"?>
<configuration>

    <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" />
            </namespaces>
        </pages>
    </system.web.webPages.razor>

    <system.web>
        <compilation targetFramework="4.0">
            <assemblies>
                <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
                <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
            </assemblies>
        </compilation>
    </system.web>

</configuration>

0 votes

Assurez-vous de l'ajouter à la racine de votre projet et il fonctionnera même sans tous ces assemblages référencés.

1 votes

Cela a bien fonctionné, merci. C'est peut-être évident, mais après quelques essais et erreurs, je me suis rendu compte que la configuration doit être nommée Web.config et non App.config.

0 votes

Cette configuration permet à l @model pour être reconnu ( @ModelType en VB.Net) mais le problème suivant que je rencontre est que @Html ne se résout pas à WebViewPage(Of TModel).Html As System.Web.HtmlHelper(Of TModel) mais fait plutôt une référence ambiguë à System.Web.Mvc.Html et System.Web.WebPages.Html en VB.Net.

12voto

Omar Points 16654

Pour Visual Studio 2012/ASP.NET MVC 4, vous devez mettre à jour les versions de l'assemblage et ajouter <add key="webpages:Version" value="2.0.0.0" /> à appSettings . Voici à quoi ressemble mon Web.config :

<?xml version="1.0"?>
<configuration>

  <configSections>
    <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
      <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.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=4.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" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

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

  <system.web>
    <compilation targetFramework="4.5">
      <assemblies>
        <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
        <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
        <add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
        <add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      </assemblies>
    </compilation>
  </system.web>

</configuration>

1 votes

Cela a réglé le problème pour moi. Je crois que la différence était les assemblages sous l'élément system.web.compilation.

6voto

BlueMonkMN Points 10838

J'ai suivi la suggestion de Jammer et je documente ce que je crois être l'ensemble minimal d'actions pour obtenir un projet apte à servir de projet de bibliothèque de classes ASP.NET MVC4. Ceci a été fait dans Visual Studio 2012 Update 4, et visait VB.Net. J'inclurai peut-être plus tard une documentation pour faire quelque chose de similaire dans Visual Studio 2013 si j'en ai l'occasion. Voici les mesures que j'ai prises :

  1. Créez un nouveau projet MVC4 vierge avec un répertoire distinct pour la solution (afin que vous puissiez clairement voir que le fichier packages avec des versions mises à jour des fichiers de référence fait partie du projet).
  2. Ajoutez un contrôleur, une vue et un modèle factices pour le tester (ce qui impliquait de copier la DLL de sortie et la vue dans une autre application Web après avoir construit la bibliothèque de classes).
  3. Supprimez les fichiers suivants du projet :
    • L'ensemble App_Start dossier
    • L'ensemble App_Data et tous les autres dossiers vides (mon historique Mercurial n'a pas rendu cela visible donc je vais de mémoire).
    • Global.asax
    • Global.asax.vb
    • Le site Web.config dans la racine et le fichier dépendant Web.Debug.config et Web.Release.config des fichiers. (Faire pas supprimer Web.config du dossier Views).
  4. Supprimer les sections suivantes du Web.config dans le dossier Views :
    • appSettings
    • system.web
    • system.webServer
    • Vous pouvez également supprimer des lignes <add namespace="System.Web.Mvc.Ajax" /> et <add namespace="System.Web.Routing" />
  5. Supprimez les références suivantes du projet (* les références étoilées étaient des références spécifiques à la version qui allaient dans le fichier packages et avoir Copy Local et Specific Version réglé sur True ).
    • System.Web.Entity
    • System.Web.ApplicationServices
    • System.ComponentModel.DataAnnotations
    • System.Data.DataSetExtensions
    • System.Web.Extensions
    • System.Web.Extensions.Design
    • System.Xml.Linq
    • System.Web.Abstractions
    • System.Web.Routing
    • System.Configuration
    • System.Web.Services
    • System.EnterpriseServices
    • Microsoft.Web.Infrastructure (1.0.0.0) *
    • Microsoft.Web.Mvc.FixedDisplayModes (1.0.0) *
    • Newtonsoft.Json (4.5.11) *
    • System.Net.Http (2.0.20710.0) *
    • System.Net.Http.Formatting (4.0.20710.0) *
    • System.Net.Http.WebRequest (2.0.20710.0) *
    • System.Web.Helpers (2.0.20710.0) *
    • System.Web.Http (4.0.20710.0) *
    • System.Web.Http.WebHost (4.0.20710.0) *
  6. Supprimez les importations suivantes des paramètres du projet :
    • System.Xml.Linq
    • System.Collections.Specialized
    • System.Configuration
    • System.Web.Caching
    • System.Web.Mvc.Ajax
    • System.Web.Routing
    • System.Web.SessionState
    • System.Web.Security
    • System.Web.Profile
    • System.Web.UI
    • System.Web.UI.WebControls
    • System.Web.UI.WebControls.WebParts
    • System.Web.UI.HtmlControls
  7. Retirez les éléments suivants de packages.config :
    • <package id="Microsoft.AspNet.Mvc.FixedDisplayModes" version="1.0.0" targetFramework="net40" />
    • <package id="Microsoft.AspNet.WebApi" version="4.0.20710.0" targetFramework="net40" />
    • <package id="Microsoft.AspNet.WebApi.Client" version="4.0.20710.0" targetFramework="net40" />
    • <package id="Microsoft.AspNet.WebApi.Core" version="4.0.20710.0" targetFramework="net40" />
    • <package id="Microsoft.AspNet.WebApi.WebHost" version="4.0.20710.0" targetFramework="net40" />
    • <package id="Microsoft.Net.Http" version="2.0.20710.0" targetFramework="net40" />
    • <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net40" />
    • <package id="Newtonsoft.Json" version="4.5.11" targetFramework="net40" />
  8. Supprimez les sous-répertoires suivants du dossier packages :
    • Microsoft.AspNet.Mvc.FixedDisplayModes.1.0.0
    • Microsoft.AspNet.WebApi.4.0.20710.0
    • Microsoft.AspNet.WebApi.Client.4.0.20710.0
    • Microsoft.AspNet.WebApi.Core.4.0.20710.0
    • Microsoft.AspNet.WebApi.WebHost.4.0.20710.0
    • Microsoft.Net.Http.2.0.20710.0
    • Microsoft.Web.Infrastructure.1.0.0.0
    • Newtonsoft.Json.4.5.11

Il ne me reste plus qu'à répondre à la question suivante :

  1. Un projet de bibliothèque de classes VB.Net ciblant .NET Framework 4 (bien que j'aie voulu que ce soit 4.5 - je pense que les deux fonctionnent).
  2. Les références .NET non par défaut suivantes (les références étoilées doivent avoir Copy Local et Specific Version réglé sur True ) :
    • System.Web
    • paquets \Microsoft.AspNet.Mvc.4.0.20710.0\lib\net40\System.Web.Mvc.dll *
    • paquets \Microsoft.AspNet.Razor.2.0.20715.0\lib\net40\System.Web.Razor.dll *
    • paquets \Microsoft.AspNet.WebPages.2.0.20710.0\lib\net40\System.Web.WebPages.dll *
    • paquets \Microsoft.AspNet.WebPages.2.0.20710.0\lib\net40\System.Web.WebPages.Deployment.dll *
    • paquets \Microsoft.AspNet.WebPages.2.0.20710.0\lib\net40\System.Web.WebPages.Razor.dll *
  3. Les importations par défaut suivantes :
    • System.Web
    • System.Web.Mvc
    • System.Web.Mvc.Html
  4. Les fichiers/structures du projet suivants :
    • Controllers dossier contenant CustomUIController.vb
    • Models dossier contenant CustomUIModel.vb
    • Views dossier contenant CustomUI dossier, contenant Index.vbhtml
  5. Web.config dans le dossier Views. Voir ci-dessous pour le contenu.
  6. packages.config dans la racine du projet. Voir ci-dessous pour le contenu.

Le contenu de mes fichiers est le suivant :

Web.config

<?xml version="1.0"?>

<configuration>
  <configSections>
    <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
      <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.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=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Html" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

</configuration>

paquets.config

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.AspNet.Mvc" version="4.0.20710.0" targetFramework="net40" />
  <package id="Microsoft.AspNet.Razor" version="2.0.20715.0" targetFramework="net40" />
  <package id="Microsoft.AspNet.WebPages" version="2.0.20710.0" targetFramework="net40" />
</packages>

CustomUIController.vb

Imports System.Web.Mvc

Public Class CustomUIController
   Inherits Controller

   Public Function Index() As ActionResult
      Return View()
   End Function
End Class

CustomUIModel.vb

Public Class CustomUIModel
   Public Property Name As String
   Public Property Value As Decimal
End Class

Index.vbhtml

@ModelType CustomTemplate.CustomUIModel

@Html.LabelFor(Function(m) m.Name)

À ce stade, je suis en mesure de travailler avec Intellisense qui m'assiste dans les vues .vbhtml et les classes .vb, de construire le projet, puis de copier uniquement les vues dans l'application primaire déployée. Views (dans le sous-répertoire approprié), et la DLL de sortie principale du projet dans le dossier de l'application principale déployée. bin (les fichiers DLL dépendants s'y trouvent déjà).

Edit :

Après avoir suivi le processus sur un autre système pour le valider et savoir comment il fonctionne pour .NET 4.5 et VS 2013, j'ai remarqué ce qui suit :

  1. Je pense que j'ai négligé de mentionner que la référence à System.Web.DynamicData peuvent être retirés.
  2. Dans VS 2013 et/ou .NET 4.5, certaines versions changent :
    • paquets \Microsoft.AspNet.Mvc.4.0.30506.0\lib\net40\System.Web.Mvc.dll
    • paquets \Microsoft.AspNet.Razor.2.0.30506.0\lib\net40\System.Web.Razor.dll
    • paquets \Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.dll
    • paquets \Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.Deployment.dll
    • paquets \Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.Razor.dll
  3. Je ne sais pas si je l'ai suffisamment souligné plus haut, mais les références aux DLL privées (Copy Local) faire doivent être réglés sur Copie locale, et/ou faire doivent utiliser la version fournie dans le dossier des paquets lorsqu'ils créent un projet à partir du modèle MVC4. Je ne sais pas pourquoi, mais les versions standard de .NET (non privées) ne semblent pas fonctionner, du moins en ce qui concerne Intellisense.
  4. La meilleure façon de vérifier si tout est encore "OK" du point de vue de l'IDE est de fermer la solution, de supprimer le fichier d'aide à l'écriture de la solution et d'ajouter le fichier d'aide à l'écriture. bin et obj dans la sortie du projet personnalisé, rechargez la solution, mettez le curseur sur LabelFor dans le fichier Index.vbhtml, et appuyez sur la touche F12 pour voir si cela vous amène au navigateur d'objets.

En raison des nouvelles versions, le fichier des paquets est différent :

Packages.config

<packages>
  <package id="Microsoft.AspNet.Mvc" version="4.0.30506.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.Razor" version="2.0.30506.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebPages" version="2.0.30506.0" targetFramework="net45" />
</packages>

4voto

Rap Points 3307

Bon, c'est un peu tiré par les cheveux, mais j'ai rencontré le même problème. Utilisez-vous JetBrains Resharper ?

Resharper remplace le moteur intellisense de VS mais il ne comprend pas la syntaxe Razor. Vous devez simplement dire à VS de se fier à son propre intellisense plutôt qu'à celui de Resharper.

Dans VS2010, allez dans Resharper - Options - Intellisense - Général. Cochez ensuite le bouton radio Visual Studio.

Ça a bien marché pour moi.

3voto

Jammer Points 1940

Aucune des solutions que j'ai pu trouver en ligne ou sur SO ne m'a permis de résoudre ce problème.

Cela peut sembler être un coup de massue pour casser une noix, mais j'ai créé un projet d'application MVC 4 au lieu d'une bibliothèque de classes et j'ai supprimé tout ce dont je n'avais pas besoin. Intellisense et @model fonctionne bien.

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