Le mystérieux cas de l’intellisense défectueux dans mes vues ASP.NET MVC

Depuis un certain temps, je travaille sur un nouveau projet. Le projet en soi, n’a rien de particulier. Il s’agit d’un site web corporatif très normal, utilisant ASP.NET MVC 5 et développé en utilisant Visual Studio 2013.

Je vous le promets. Peu importe l’angle avec lequel vous regardez ce projet, il n’y a rien de plus normal. En bref, c’est business as usual côté développement.

Malgré que ce projet est tout ce qu’il a de plus normal au monde, lorsque j’y développe des fonctionnalités dans les vues ASP.NET MVC quelque chose ne tournait pas rond. Toutefois, j’ai été un bon bout de temps à ne pas être en mesure de mettre le doigt sur la source de ce qui affectait une très petite fonctionnalité de l’éditeur de vues ASP.NET MVC.

mvc-intellisense-bug

Voici le problème en pleine action! Le voyez-vous? Il n’est pas très subtil dans le premier et il y a clairement quelque chose qui ne tourne pas rond dans le deuxième.

Ce que mentionne la deuxième prise d’écran est que l’analyseur de syntaxe Razor est incapable de comprendre ce que signifie l’élément HTML List<ProductsViewModel>. Louche, n’est-ce pas? Ce qui m’a longtemps laissé songeur est que le message d’erreur est seulement un symptôme et non pas un indicateur d’une solution possible.

À un fichier d’une solution

Au moment que je m’y attendais le moins, l’un de mes coéquipiers m’annonce qu’il a trouvé une solution à ce fichu de problème. Il s’avère que le fichier web.config situé dans le dossier Views n’était pas ajusté pour la version d’ASP.NET MVC que nous utilisions.


<?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:Enabled" value="false" />
</appSettings>
<system.web>
<httpHandlers>
<add path="*" verb="*" type="System.Web.HttpNotFoundHandler"/>
</httpHandlers>
<!–
Enabling request validation in view pages would cause validation to occur
after the input has already been processed by the controller. By default
MVC performs request validation before a controller processes the input.
To change this behavior apply the ValidateInputAttribute to a
controller or action.
–>
<pages
validateRequest="false"
pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<controls>
<add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
</controls>
</pages>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<remove name="BlockViewHandler"/>
<add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
</handlers>
</system.webServer>
</configuration>

view raw

web.config

hosted with ❤ by GitHub

Comme je disais en préambule, le « très normal » projet avait été démarré en utilisant la version 4 d’ASP.NET MVC et il a été mis à jour à la version 5 en cours de route. Impossible de se souvenir ce qui a pu se passer. La piste la plus plausible est que le processus de mise à jour s’est égaré en cours de route.

En bout de compte, il s’agit d’un problème relativement mineur, mais il m’a obsédé pendant quelques jours. Je suis très content d’en avoir vu la fin!

La leçon de l’histoire est la suivante: le fichier web.config du dossier /Views est très important dans le fonctionnement de l’affichage de la coloration syntaxique de Razor. Assurez-vous qu’il soit mis à jour si vous mettez à jour votre projet à ASP.NET MVC 5.

À titre de référence, voici une copie du fichier pour MVC 5.2. Vous devez remplacer le contenu de la ligne 19 avec votre namespace.

Publicité

Auteur : Pascal Paradis

Je suis les mains et le cerveau derrière http://frenchcoding.com. Je développe des microservices chez @UbisoftMTL. Amateur de Hockey et j'aime la technologie, en général.

2 réflexions sur “Le mystérieux cas de l’intellisense défectueux dans mes vues ASP.NET MVC”

  1. Lecture très pertinente !

    Je viens de mettre à jour mon propre projet MVC en constatant qu’effectivement, la référence du web.config du dossier View était attachée à MVC 4.

    Merci beaucoup !!!

Laisser un commentaire

Entrer les renseignements ci-dessous ou cliquer sur une icône pour ouvrir une session :

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.

%d blogueueurs aiment cette page :