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:
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)
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>
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>
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:
packages
avec les versions mises à jour des fichiers de référence fait partie du projet).App_Start
dossierApp_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
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.)Web.config
fichier dans le dossier Vues: appSettings
system.web
system.webServer
<add namespace="System.Web.Mvc.Ajax" />
et <add namespace="System.Web.Routing" />
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) *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
packages.config
: Cela me laisse avec ce qui suit:
Copy Local
et Specific Version
défini sur True
): Controllers
dossier contenant CustomUIController.vb
Models
dossier contenant CustomUIModel.vb
Views
dossier contenant CustomUI
dossier, contenant Index.vbhtml
Web.config
fichier dans le dossier Vues. Voir ci-dessous pour le contenu.packages.config
fichier à la racine du projet. Voir ci-dessous pour le contenu.Le contenu de mes fichiers est le suivant:
<?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>
<?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>
Imports System.Web.Mvc
Public Class CustomUIController
Inherits Controller
Public Function Index() As ActionResult
Return View()
End Function
End Class
Public Class CustomUIModel
Public Property Name As String
Public Property Value As Decimal
End Class
@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:
System.Web.DynamicData
Peut être enlevé.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>
<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>
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.
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.