2009-04-15 18 views
48

que tienen algo de código en mi página maestra que establece un hipervínculo con un poco de contexto la información sensible¿Cómo me deshago de __o no está declarado?

<%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--> 

Ahora el problema parece estar en la parte href. Si elimino el código dinámico, el error desaparece. ¿Alguien puede decirme cómo resolver este problema?

Respuesta

66

He encontrado el answer en los foros de .net. Contiene una buena explicación de por qué ASP.Net está actuando como está:

Finalmente hemos obtenido una reproducción confiable e identificado el problema subyacente. Un repro trivial es el siguiente:

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

el fin de proporcionar IntelliSense en <% =%> bloques en tiempo de diseño, ASP.NET genera asignación a una variable temporal y __o idioma (VB o C#) y luego dar la intellisense para la variable. Eso se hace cuando el compilador de páginas ve el primer bloque <% = ...%>. Pero aquí, el bloque está dentro del if, así que después de que el if se cierre, la variable queda fuera del alcance. Terminamos generando algo como esto:

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

La solución consiste en agregar una expresión ficticia al principio de la página. P.ej. <% = ""%>. Esto no generará nada, y se asegurará de que __o se declare como nivel superior en el método Render, antes de cualquier declaración potencial 'if' (u otro alcance).

Una solución alternativa es simplemente usar

<% response.write(var) %> 

en lugar de

<%= var %> 
+0

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

+0

El ... <%="" %> ... soluciona mi problema, pero la explicación de "Terminamos generando algo como esto ... si (verdadero) { objeto @__o; @__o = 1; } @__o = 2; " no tiene sentido en mi ejemplo, ya que todos mis "<%= var %>" están dentro de mi único "IF", ninguno afuera, y arrojan el error desde el "IF". –

+0

El uso de '<%="" %>' funcionó para mí, no más errores molestos ... thxs – Yaroslav

14

Sí, he experimentado el mismo error de vez en cuando en páginas que usan construcciones del lado del servidor en páginas ASPX.

En horas extras, encontré una solución (lo siento, simplemente no he podido averiguar dónde encontré este bit de información otra vez) y esa solución es poner el siguiente código sobre el error <%...%> bloque:

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

al parecer, donde se coloca el código anterior hace toda la diferencia en VS.NET, por lo que puede tomar varios intentos para hacerlo bien.

+1

Incluso si ya tenía otro '<% = myVarialble%>' antes de la primera declaración '<% If ... Then%>', tuve este problema, pero incluyéndolo en otro lugar lo resolví. Probé en diferentes lugares, y no fue consistente en qué tipo de lugar falló y dónde funcionó, por lo que tienes mucha razón. Se requiere probar diferentes lugares para que funcione. Lo coloqué directamente después de '

' que probablemente sea un buen lugar en la mayoría de los casos. – awe

+0

Gracias por ese útil comentario, @awe! – Cerebrus

0

Después de algunas horas de googlear y analizar montón de aspx'ses en mi proyecto actual parece que he encontrado la solución, eso está funcionando para mí. Sería aconsejar encarecidamente evitar comentarios de estilo html:

<!-- ... -->

dentro de la página aspx. En lugar de ello utilice aspx de estilo comenta

<%-- ... --%>

Además me ayudó a lograr que vs IntelliSense y el código resaltado convirtió en trabajar de nuevo y el principalmente cosa - este caso se había iniciado de ella - vs ahora puede golpear los puntos de ruptura en el interior piezas integradas de código vb/cs! Y no hay ningún maldito mensaje "Esto no es una ubicación válida para un punto de interrupción".

2

Esta es una solución extraña, pero para mí me las arreglé para solucionar este problema simplemente cerrando los archivos abiertos ofensivos en Visual Studio.

Con ellos abiertos, estaba erráticamente obteniendo el problema __o.

Tan pronto como los cerré, el problema __o desapareció.

0

Cuando limpié la solución, reinicié IIS y todavía se está reproduciendo misteriosamente, creo que esto a veces puede deberse a pegar los contenidos de un archivo fuente ASPX de otro sistema en Visual Studio que "útilmente" actualiza el código, posiblemente cambiando algunos ID y rompiendo la página.

Pegándolo en otro editor (Notepad ++?) Luego guardarlo detiene Visual Studio de "ser útil" y la página funciona de nuevo.

Cuestiones relacionadas