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 :
- 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).
- 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).
- 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).
- 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" />
- 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) *
- 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
- 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" />
- 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 :
- 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).
- 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 *
- Les importations par défaut suivantes :
- System.Web
- System.Web.Mvc
- System.Web.Mvc.Html
- Les fichiers/structures du projet suivants :
-
Controllers
dossier contenant CustomUIController.vb
-
Models
dossier contenant CustomUIModel.vb
-
Views
dossier contenant CustomUI
dossier, contenant Index.vbhtml
-
Web.config
dans le dossier Views. Voir ci-dessous pour le contenu.
-
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 :
- Je pense que j'ai négligé de mentionner que la référence à
System.Web.DynamicData
peuvent être retirés.
- 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
- 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.
- 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>
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.
1 votes
Ok, j'ai joué un peu et j'ai découvert que si vous voulez accéder à des objets locaux (classes dans votre bibliothèque), ils doivent être définis comme publics pour que l'Intellisense s'affiche. Faites un essai et voyez si cela fonctionne. Sinon, une ClassLibrary par défaut a intellisense il semble.
0 votes
Un meilleur message d'erreur est désormais fourni avec le produit MVC3 RTM. Je l'ai ajouté ci-dessus.
0 votes
J'ai installé MVC3 et une mise à jour de Resharper aujourd'hui et soudainement j'ai Razor intellisense.
0 votes
J'ai eu un problème similaire, je l'ai résolu en m'assurant que mon projet faisait référence à
Microsoft.CSharp