Je viens d'installer Visual Studio 2015 et j'ai ouvert mon projet asp .net sur lequel je travaillais. Je reçois beaucoup d'erreurs (toutes exactement les mêmes) que ci-dessous:
Erreur CS0103 Le nom '__o' n'existe pas dans le contexte actuel
En fait, je n'ai aucune variable nommée __o et le code fonctionne comme un charme (l'erreur est invalide), mais ce qui me dérange, c'est que je ne suis pas en mesure de voir quand mon code comporte réellement une erreur car il figure quelque part dans cette liste. et je devrais vérifier toute la liste.
J'ai découvert que si je choisissais Construire uniquement au lieu de Construire + IntelliSense les erreurs (liées à IntelliSense) disparaîtront.
Mise à jour 1: la raison
La raison en est que, pour des codes comme celui-ci:
<% if (true) { %>
<%=1%>
<% } %>
<%=2%>
Afin de fournir IntelliSense en blocs <% =%> au moment de la conception, ASP.NET génère une affectation à une variable et à un langage temporaires __o (VB ou C #), puis fournit IntelliSense pour la variable. Cela est fait lorsque le compilateur de page voit le premier bloc <% = ...%>. Mais ici, le bloc est dans le if, donc après la fermeture du if, la variable sort de la portée. Nous finissons par générer quelque chose comme ceci:
if (true) {
object @__o;
@__o = 1;
}
@__o = 2;
La solution consiste à ajouter une expression fictive au début de la page. Par exemple. <% = ""%>. Cela ne rendra rien et garantira que __o est déclaré niveau supérieur dans la méthode Render, avant toute instruction if (ou autre) de portée potentielle.
Mise à jour 2: Éliminer cette erreur sans perdre d'autres erreurs IntelliSense
Cliquez sur le bouton de filtrage dans le coin supérieur gauche du panneau de la liste d’erreurs et décochez la case CS0103 pour laquelle le code d’erreur correspondant à: Le nom '__o' n'existe pas dans le contexte actuel et ces erreurs ne seront plus affichées. Vous pouvez toujours avoir d'autres erreurs et avertissements IntelliSense:
Après avoir lu les liens donnés dans les commentaires ci-dessus, il s'avère que intellisense gère les blocages.
Mikhail Arkhipov a publié une explication et une solution de contournement dans les forums ASP.NET :
Nous avons finalement obtenu une repro fiable et identifié le problème sous-jacent. Une repro triviale ressemble à ceci:
<% if (true) { %> <%=1%> <% } %> <%=2%>
Afin de fournir intellisense en
<%= %>
blocs au moment de la conception, ASP.NET génère une affectation à un__o
variable et langage (VB ou C #) fournissent alors l'intellisense pour la variable. Ceci est fait quand le compilateur de page voit le premier<%= ... %>
bloc. Mais ici, le bloc est à l'intérieur deif
, donc après la fermeture deif
, la variable sort de la portée. Nous finissons par générer quelque chose comme ceci:if (true) { object @__o; @__o = 1; } @__o = 2;
La solution consiste à ajouter une expression fictive au début de la page. Par exemple.
<%="" %>
. Cela ne rendra rien et assurera que__o
est déclaré niveau supérieur dans la méthode de rendu, avant toute instruction potentielleif
(ou autre portée).
En notant ci-dessus, la réponse de Echec ne fait pas beaucoup de mal, si ce n'est de cacher toutes les erreurs intellisense, qui seraient de toute façon connues au moment de la construction.
Référence: http://youku.io/questions/324366/asp-net-mvc-error-name-o-is-not-declaredhttps://msdn.Microsoft. com/en-us/library/t8zbaa6f.aspx
<% response.write (var)%> au lieu de <% = var%> supprime l'erreur sans déclarer __o comme suggéré, d'autres publications
Ce qui a résolu ce problème du fond du cœur pour moi, c’est d’ajouter une expression factice au début de la page. Par exemple. <% = ""%>. Consultez ce lien pour plus d'explications: entrez la description du lien ici