2012-03-22 12 views
6

¡Hola, esto es realmente extraño!En asp.Net, escribir código en la etiqueta de control genera un error de compilación

Pero mira el siguiente código ASP:

<div runat="server" id="MainDiv"> 
     <%foreach (string str in new string[]{"First#", "Second#"}) 
      { %> 
      <div id="<%=str.Replace("#","div") %>"> 
      </div> 
     <%} %> 
    </div> 

ahora si se pone este código dentro de cualquier página web (y no se preocupe por la moral de este código, lo hice sólo para mostrar la idea) obtendrá este error:

compilador Mensaje de error: CS1518: se esperaba clase, delegado, enumeración, interfaz, o estructura

por supuesto, el error no tiene nada que ver con el verdadero problema, he buscado el código que fue generado por asp.net y descubrió lo siguiente:

 private void @__RenderMainDiv(System.Web.UI.HtmlTextWriter @__w, System.Web.UI.Control parameterContainer) 
    { 
     @__w.Write("\r\n  "); 

     #line 20 "blabla\blabla\Default.aspx" 
     foreach (string str in new string[] { "First#", "Second#" }) 
     { 

      #line default 
      #line hidden 
      @__w.Write("\r\n  <div id=\""); 

      #line 22 "blabla\blabla\Default.aspx" 
      @__w.Write(str.Replace("#", "div")); 


      #line default 
      #line hidden 
      @__w.Write("\">\r\n  "); 
    } 

Este es el código que se genera a partir de la página ASP y este es el método que está destinado a hacer que nuestra div (MainDiv), descubrí que hay un soporte perdido "} "que cierra el método o el (para bucle).

ahora el problema tiene tres partes:
1- primero debe tener un control de servidor (en nuestra situación es la MainDiv) y no estoy seguro de si es solo la etiqueta div.
2- control HTML dentro del control de servidor y un código en su interior usando el signo de comillas doble (por ejemplo <div id="<%=str en lugar de <div id='<%=str
3-Cualquier palabra clave que tiene soportes de bloques por ejemplo:. Para {}, mientras que {}, usando { .} ... etc

ahora la eliminación de cualquier parte, va a resolver el problema !!!

cómo sucede esto ?? cualquier idea

Por cierto:? por favor me ayude a hacer la pregunta más obvio, porque no pude encontrar las mejores palabras para describir el problema.

¡¡¡Parece que mi pregunta no está clara !! Mi pregunta es: ¿cuáles son los pasos que sigue asp.net para generar un código tan erróneo? ¡¿Cómo está pasando eso ?! No quiero la solución para la excepción, ya lo resolví usando una sola cita.

Respuesta

0

Esto funcionó para mí:

<div runat="server" id="MainDiv"> 
     <%foreach (string str in new string[]{"First#", "Second#"})%> 
      <%{%> 
      <% string str1 = str.Replace("#","div"); %> 
      <div id='<%= str1%>'>123</div> 
      <%}%> 
</div> 
+0

Ok, sé cómo resolver el problema, y ​​ya lo he resuelto, pero tengo curiosidad sobre la forma en que ocurrió este error ?? –

6

No se puede encerrar entre comillas dobles en comillas dobles.

<div id="<%=str.Replace("#","div") %>"> 

No se da cuenta cuando uno se supone para comenzar o final, que es la razón por

<div id='<%=str.Replace("#","div") %>'> 

funcionaría.

De lo contrario, se piensa que el código es

<div id="<%=str.Replace(" 
"," 
div 
") %>" 
) 

que por supuesto no tiene sentido.

actualización de la base de mi comentario a continuación

Adición de la runat="server" hace que el control que ser analizado por ASP.NET, de lo contrario se acaba de pasar directamente como html.

Si ASP.NET lo analiza, las cosas son diferentes. Para ser sincero, no estoy seguro del funcionamiento interno exacto en juego aquí. Todo lo que puedo decir es que si el atributo runat="server" está establecido, ASP.NET lo analiza y lo reproduce según reglas diferentes.

Intentará descomponer el html interno como describí anteriormente.

Si se elimina el atributo runat="server", se pasa como html, por lo tanto, el código en línea se procesa y luego se envía con el html circundante, independientemente de lo que sea, p. Ej. doble comillas.

+0

, pero si sigues usando las comillas dobles y, por ejemplo, eliminas runat = "server" del div principal, el problema se resolverá ??? ¡así que el problema no está en las comillas dobles! –

+2

Bueno, realmente no. Agregar runat = "server" hace que ASP.NET analice el control; de lo contrario, acaba de pasar directamente como html. Si ASP.NET lo analiza, las cosas son diferentes. Para ser sincero, no estoy seguro del funcionamiento interno exacto en juego aquí. Todo lo que puedo decir es que si el atributo runat = "server" está establecido, ASP.NET lo analiza y lo reproduce según reglas diferentes. Lo más probable es que intente descomponer el Html interno como describí anteriormente en mi respuesta. –

+1

@Downvoter - normalmente es cortés al comentar por qué se votó negativamente por lo que tenemos la oportunidad de mejorar la respuesta. –

0

No estoy seguro de que pueda averiguar por completo por qué el analizador está haciendo lo que es, pero es obvio a partir de la última línea de código real que tiene sus bragas en un giro.

@__ w.Write ("\"> \ r \ n ");

Esto está poniendo a cabo "> y no sólo > - esta es la última Chevron en este declaración

<div id="<%=str.Replace("#","div") %>"> 

por lo tanto, en este punto el analizador cree que está en una cadena, pero no encuentra ningún terminador, por lo que no fuera - esto significa que la última

<%}%> nunca se analiza, y se produce un problema.

Sugeriría que esto se debe a que el analizador está trabajando de forma lineal y no es hasta que el terminador de cadena faltante se 'descubre' que ocurre el error.

0

Eso es extraño y lo más probable es un problema con el uso de ese tipo de sintaxis con formularios web, pero yo era capaz de obtener este código para compilar y hacer que los divs a la página:

<div runat="server" id="MainDiv"> 
    <%foreach (string str in new string[] {"First#", "Second#"}) 
     {%> 
     <div id='<%= string.Format("{0}", str.Replace("#","div")) %>'> 
      Testing 
     </div> 
    <%}%> 
</div> 
+0

@NourSabouny: El problema son las comillas dobles. El código anterior compila y representa la salida como se esperaba. –

0

uso de comillas simples en lugar de doble

+0

Mi amigo, ya mencioné la solución en mi pregunta, ¡y usted no está respondiendo mi pregunta! –

Cuestiones relacionadas