2010-06-06 9 views
10

Me encontré con un problema molesto: el siguiente código da una advertencia en Visual Studio.Visual Studio confundido por el código del servidor dentro de javascript

<script type="text/javascript"> 
var x = <%: ViewData["param"] %>; 
</script> 

La advertencia es "Expected expression". Visual Studio se confunde, y todo el código de javascript después de eso está dando toneladas de advertencias. De acuerdo, son todas las advertencias, y funcionan perfectamente bien en tiempo de ejecución, pero es muy fácil perder advertencias reales entre una docena de falsos positivos.

Funcionó de la misma manera en VS2008, y no se solucionó en VS2010. ¿Alguien sabe si hay una solución alternativa o un parche?

+0

¿En qué contexto se ejecuta el script anterior? Supongo que es posible que interprete el '

2

Debe ajustar la expresión del lado del servidor entre comillas.

<script type="text/javascript"> 
var x = "<%: ViewData["param"] %>"; 
</script> 
+0

¿Qué ocurre si el valor almacenado en 'ViewData' es numérico y los cálculos se realizan con la variable' x'? –

+1

parseInt ("<%: ViewData [" param "]%>"); –

+0

Sí, funcionará, pero hacer esas cosas torpes solo para superar el error VS parece una exageración. Después de todo, mi objetivo es escribir un código de limpieza eficiente. ¡Con suerte, se lo arreglará en algún paquete de servicio! – Felix

0

El enfoque que está tomando no es particularmente robusto. Obviamente, no funcionaría si quisiera mover su código Javascript a un archivo separado para mejorar los tiempos de carga de su página ...

Será mejor que use campos de formulario ocultos para mover datos del servidor a script de cliente. Alternativamente, puede construir el código JS del solucionador de variables programáticamente haciendo un montón de concatenación de cadenas, luego usando el método ClientScriptManager.RegisterClientScriptBlock() para inyectarlo en la salida.

+0

Gracias a todos por sus comentarios. Mientras usaba la etiqueta asp.net- * mvc *, no mencioné explícitamente que es un código MVC y, por lo tanto, las sugerencias de código subyacente y de ClientScriptManager solo son parcialmente relevantes. Podemos discutir si el enfoque es sólido o no (obviamente, * funcionará * en un archivo Javascript por separado), pero prefiero dejarlo para otro momento, ya que está fuera del alcance de esta pregunta. No estoy seguro de por qué es demasiado pedirle a VS: es bastante inteligente analizar aspx y el código del servidor de forma independiente en otros lugares. – Felix

0

Creo que pides a Visual Studio que entienda las ideas demasiado difíciles.

¿Cómo puede saber Visual Studio qué hay dentro de la cuerda que pasa?, sus parámetros, más código, ¿qué es? ¿Cómo VS puede saber qué es para poder pisarlos de esa manera?

Así que deciden que todo en la etiqueta del script debe ser JavaScript.

Mi opinión es que si ganó para evitar este error, escriba renderizar este código JavaScript detrás y no dentro de la página aspx.

string cPlaceMeOnScript = "<script type=\"text/javascript\">var x =" + ViewData["param"] +";</script>" 

y utilice cualquier método para colocar esta cadena al inicio de la secuencia de comandos.

0

No puedo creer cuántas respuestas dicen "Ponga el JavaScript en el código subyacente". Esta es una muy mala idea y confunde su código al mezclar la presentación con la lógica comercial. Como decía el cartel original, esto es solo una mera advertencia. Si bien es molesto, no vale la pena mezclar tu comportamiento presencial con el código del lado del servidor (por ejemplo, escribir código deficiente).

+0

* No puedo creer cuántas respuestas dicen "Ponga el JavaScript en el código subyacente" * Solo uno si no me equivoco :) – Felix

2

Puede engañar al IDE utilizando comillas o comentarios de la línea

código original:

<script type="Text/javascript"> 
    <%If Page.IsPostback Then%> 
    alert("my javascript code"); 
    <%End If%> 
    </script> 

solución:

<script type="Text/javascript"> 
    //<%If Page.IsPostback Then%> 
    alert("my javascript code"); 
    //<%End If%> 
    </script> 
+1

OriNet - ¿Estás seguro de que destinado a publicarlo en * esta * página? No es relevante para nada en la publicación original ... – Felix

+0

@Felix Por supuesto que es una respuesta y debe usarse junto con la respuesta de Dustin Laine, ya que su respuesta es solo para expresiones que pueden ser entrecomilladas, pero es no válido para las declaraciones "if", que se resuelve con esta técnica, pero, por supuesto, es incluso más exagerado que se use realmente –

0

Este no es el comportamiento estándar, y que sólo ocurre al azar , y en tal situación, cambiar el nombre del archivo y luego construir ayudará (y es posible que incluso sin construirlo se resuelva), y luego puede volver atrás.

También puede deshabilitar por completo las advertencias en Java Script en Herramientas -> Opciones -> Editor de texto -> JScript -> Varios.

Por supuesto, en este caso se perderá las advertencias de Java Script, pero al menos podrá concentrarse en las advertencias del lado del servidor.

Cuestiones relacionadas