2009-04-15 2 views
48

Ich habe einige Codes in meiner Master-Seite, dieWie werde ich von __o loswerden nicht deklariert?

<%If Not IsNothing(Profile.ClientID) Then%> 
<span class="menu-nav"> 
<a target="_blank" 
    href= 
"http://b/x.aspx?ClientID=<%=Profile.ClientID.ToString()%>&Initials=<%=Session("Initials")%>"  
    > 
    Send 
    <br /> 
    SMS 
    <br /> 
</a> 

</span> 
<%End If %> 

<span class="menu-nav"> <!-- Name __o is not declared Error is flagged here--> 

nun einen Hyperlink mit einigen kontextsensitiven Informationen einrichtet das Thema im href Teil zu sein scheint. Wenn ich den dynamischen Code entferne, verschwindet der Fehler. Kann mir jemand sagen, wie ich dieses Problem lösen kann?

Antwort

66

Ich habe die answer in den .net Foren gefunden. Es enthält eine gute Erklärung, warum ASP.Net so funktioniert, wie es ist:

Wir haben endlich zuverlässige Repro erhalten und das zugrunde liegende Problem identifiziert. Eine triviale Repro sieht wie folgt aus:

<% if (true) { %> 
    <%=1%> 
    <% } %> 
    <%=2%> 

Um intellisense in <% =%> Blöcke zur Entwurfszeit zur Verfügung zu stellen, ASP.NET erzeugt Zuordnung zu einer temporären __o variable und Sprache (VB oder C#), dann stellen die Intelligenz für die Variable. Dies geschieht, wenn der Seitencompiler den ersten <% = ...%> Block sieht. Aber hier befindet sich der Block innerhalb des if, so dass nach dem Schließen der if die Variable den Gültigkeitsbereich verlässt. Wir erzeugen etwas wie folgt:

if (true) { 
     object @__o; 
     @__o = 1; 
    } 
    @__o = 2; 

Die Problemumgehung besteht darin, einen Dummy-Ausdruck früh auf der Seite hinzuzufügen. Z.B. <% = ""%>. Dadurch wird nichts gerendert, und es wird sichergestellt, dass __o in der Render-Methode als oberste Ebene deklariert wird, bevor eine mögliche "if" -Anweisung (oder eine andere Scoping-Anweisung) vorliegt.

Eine alternative Lösung ist einfach

<% response.write(var) %> 

zu verwenden, statt

<%= var %> 
+0

http://forums.asp.net/p/923745/1266105.aspx –

+0

Die ... <%="" %> ... behebt mein Problem, aber die Erklärung von "Wir am Ende generieren etwas wie diese .. wenn (wahr) { Objekt @__o; @__o = 1; } @__o = 2; " macht keinen Sinn in meinem Beispiel, da alle meine "<%= var %>" in meiner einzigen "IF" sind, keine außerhalb, und sie werfen den Fehler aus dem "IF" heraus. –

+0

Die Verwendung von '<%="" %>' arbeitete für mich, keine lästigen Fehler mehr..thxs – Yaroslav

14

Ja, ich habe den gleichen Fehler gelegentlich in Seiten, die serverseitige Konstrukte auf ASPX-Seiten verwenden.

Überstunden, ich fand eine Lösung dafür (Es tut mir leid, ich konnte nicht herausfinden, wo ich diese Information wieder gefunden habe.) Und diese Lösung ist, den folgenden Code über den Fehler zu setzen <%...%> Block:

<%-- For other devs: Do not remove below line. --%> 
<%="" %> 
<%-- For other devs: Do not remove above line. --%> 

Offenbar, wo Sie den obigen Code setzen macht den Unterschied zu VS.NET, so dass es ein paar Versuche dauern kann es richtig zu machen.

+1

Selbst wenn ich schon andere '<% = myVatalicial%>' vor der ersten '<% If ... Then%>' Anweisung hatte, habe ich dieses Problem, aber das Einschließen eines anderen Ortes löste es. Ich habe verschiedene Orte ausprobiert, und es war nicht konsistent, an welchem ​​Ort, wo es gescheitert ist und wo es funktioniert hat, also hast du recht. Es ist erforderlich, verschiedene Orte auszuprobieren, um es zum Laufen zu bringen. Ich habe es direkt nach '

' platziert, was in den meisten Fällen wahrscheinlich ein guter Platz sein wird. – awe

+0

Danke für diesen nützlichen Kommentar, @ awe! – Cerebrus

0

Nach einigen Stunden googeln und Haufen von aspx'ses in meinem aktuellen Projekt Analyse scheint die ich gefunden habe die Lösung, die für mich arbeitet. Würde ich rate dringend HTML-Stil Kommentare vermeiden:

<!-- ... -->

innen aspx Seite. Statt es aspx-Stil verwenden, kommentiert

<%-- ... --%>

Außerdem half es mir, dass Hervorhebung vs Intellisense und Code erhalten wurde wieder arbeiten und die in erster Linie Sache - dieser Fall hatte von ihm begonnen - vs treffen kann nun die inneren Haltepunkte eingebettete Stücke von Vb/Cs-Code! Und keine verdammte "Dies ist kein gültiger Ort für einen Haltepunkt" Nachricht.

2

Dies ist eine seltsame Lösung, aber für mich konnte ich dieses Problem beheben, indem ich einfach die problematischen offenen Dateien in Visual Studio schließen.

Mit ihnen offen, ich bekam unregelmäßig das __o Problem.

Sobald ich sie geschlossen habe, verschwand das __o Problem.

0

Wenn ich die Lösung bereinigt, IIS neu gestartet habe und es immer noch auf mysteriöse Weise spielt, kann dies manchmal dadurch verursacht werden, dass der Inhalt einer ASPX-Quelldatei von einem anderen System in Visual Studio eingefügt wird, was den Code "hilfreich" aktualisiert. möglicherweise einige IDs ändern und die Seite zu brechen.

Einfügen in einen anderen Editor (Notepad ++?), Dann speichert Visual Studio verhindert "hilfreich" und die Seite funktioniert wieder.

Verwandte Themen