web-dev-qa-db-fra.com

Vous avez besoin d'un moteur de saisie automatique du rasoir pour travailler 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 obtenir le coloration syntaxique et saisie semi-automatique pour fonctionner lorsque le projet n'est pas un projet MVC?

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

L'intellisense fonctionne pour tout sauf 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: erreur d'exécution ASP.NET: aucun fournisseur de build n'est enregistré pour l'extension '.cshtml'. Vous pouvez en enregistrer un dans la section <compilation> <buildProviders> de machine.config ou web.config. Assurez-vous qu'il possède un attribut BuildProviderAppliesToAttribute qui inclut la valeur "Web" ou "Tous".

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: erreur d'exécution ASP.NET: impossible de charger le fichier ou l'assembly 'System.Web.WebPages.Razor' ou l'une de ses dépendances. Le système ne peut pas trouver le fichier spécifié. (C:\...\machine.config ligne 259)

47
JarrettV

Le webconfig de cet article 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>
49
Deepak

Pour Visual Studio 2012/ASP.NET MVC 4, vous devez mettre à jour les versions d'assembly 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>
12
Omar

J'ai suivi la suggestion de Jammer et je documente ce que je pense être l'ensemble minimal d'actions pour obtenir un projet adapté pour servir de projet de bibliothèque de classe ASP.NET MVC4. Cela a été fait dans Visual Studio 2012 Update 4 et visait VB.Net. Je peux inclure plus tard de la documentation pour faire quelque chose de similaire dans Visual Studio 2013 si j'en ai l'occasion. Voici les actions 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 répertoire packages avec les versions mises à jour des fichiers de référence fait partie du projet).
  2. Ajoutez un contrôleur factice, affichez et modélisez pour le tester (ce qui impliquait de copier la sortie DLL et d'afficher dans une autre application Web après avoir créé la bibliothèque de classes).
  3. Supprimez les fichiers suivants du projet:
    • La totalité App_Start dossier
    • La totalité App_Data dossier et tout autre dossier vide (mon historique Mercurial ne le rendait pas visible donc je vais de mémoire).
    • Global.asax
    • Global.asax.vb
    • Le Web.config fichier à la racine et le fichier dépendant Web.Debug.config et Web.Release.config des dossiers. (Ne pas supprimer Web.config du dossier Vues.)
  4. Supprimez les sections suivantes du Web.config fichier dans le dossier Vues:
    • 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 suivies étaient des références spécifiques à la version qui sont entrées dans le répertoire packages et ont Copy Local et Specific Version défini 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 à l'échelle du projet 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. Supprimez 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 des 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

Cela me laisse avec ce qui suit:

  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 suivies doivent avoir Copy Local et Specific Version défini sur True):
    • System.Web
    • packages\Microsoft.AspNet.Mvc.4.0.20710.0\lib\net40\System.Web.Mvc.dll *
    • packages\Microsoft.AspNet.Razor.2.0.20715.0\lib\net40\System.Web.Razor.dll *
    • packages\Microsoft.AspNet.WebPages.2.0.20710.0\lib\net40\System.Web.WebPages.dll *
    • packages\Microsoft.AspNet.WebPages.2.0.20710.0\lib\net40\System.Web.WebPages.Deployment.dll *
    • packages\Microsoft.AspNet.WebPages.2.0.20710.0\lib\net40\System.Web.WebPages.Razor.dll *
  3. Les importations non par défaut suivantes:
    • System.Web
    • System.Web.Mvc
    • System.Web.Mvc.Html
  4. Les fichiers/structure de projet suivants:
    • Controllers dossier contenant CustomUIController.vb
    • Models dossier contenant CustomUIModel.vb
    • Views dossier contenant CustomUI dossier, contenant Index.vbhtml
  5. Web.config fichier dans le dossier Vues. Voir ci-dessous pour le contenu.
  6. packages.config fichier à 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>

packages.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 peux travailler avec Intellisense pour m'aider dans les vues .vbhtml et les classes .vb, créer le projet, puis copier uniquement les vues dans le dossier Views déployé de l'application principale (dans le sous-répertoire approprié). ) et la sortie principale du projet DLL vers le répertoire bin déployé de l'application principale (le fichier dépendant DLL sont déjà là)).

Modifier:

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

  1. Je pense que j'ai oublié de mentionner que la référence à System.Web.DynamicData Peut être enlevé.
  2. Dans VS 2013 et/ou .NET 4.5, certaines versions changent:
    • packages\Microsoft.AspNet.Mvc.4.0.30506.0\lib\net40\System.Web.Mvc.dll
    • packages\Microsoft.AspNet.Razor.2.0.30506.0\lib\net40\System.Web.Razor.dll
    • packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.dll
    • packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.Deployment.dll
    • packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.Razor.dll
  3. Je ne sais pas si j'en ai fait un point assez fort ci-dessus, mais les références aux DLL privées (copie locale) doivent être définies sur Copier local et/ou doivent utiliser la version fournie dans le dossier packages lors de la création d'un projet à partir du modèle MVC4. Je ne sais pas pourquoi, mais les versions standard .NET (non privées) ne semblent pas fonctionner, en ce qui concerne Intellisense au moins.
  4. La meilleure façon de vérifier si les choses sont toujours "OK" en ce qui concerne les IDE est de fermer la solution, supprimez les dossiers bin et obj dans la sortie du projet personnalisé, rechargez la solution, placez le curseur sur LabelFor dans le fichier Index.vbhtml et appuyez sur la touche F12 pour voir si cela vous amène à l'Explorateur d'objets.

En raison des nouvelles versions, le fichier des packages 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>
6
BlueMonkMN

D'accord, c'est un long retard, 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 s'appuyer sur son propre intellisense plutôt que sur celui de Resharper.

Dans VS2010, accédez à Resharper - Options - Intellisense - General. Cochez ensuite la case d'option Visual Studio.

A très bien fonctionné pour moi.

4
Rap

Aucune des solutions que j'ai pu trouver en ligne ou sur SO n'a résolu ce problème pour moi.

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

3
Jammer