2012-08-24 37 views
58

Al usar Visual Studio 2012, en una página Razor view, en la sección de JavaScript, obtengo lo que creo es una batalla entre la sintaxis de Razor frente a la sintaxis de JavaScript. En particular, el punto y coma final en la sección del script está marcado por intellisense y se entrega una advertencia del compilador (no error):Razor/JavaScript y punto y coma posterior

'Advertencia 13 Error de sintaxis'.

Si lo elimino, entonces obtengo una recomendación de terminación de extracto (ReSharper en este caso, pero solo una buena práctica).

<script type="text/javascript"> 
    $().ready(function(){ 
     var customer = @Html.Raw(ViewBag.CustomerJSON); // <- Razor (I think) doesn't like this semicolon 
    }); 
</script> 

¿Esto es un error en Razor? Si es así, ¿hay alguna manera de reescribir esto para evitar este problema?

+1

Si eres realmente anal con eso ... como algunas personas 'pista' ... puedes hacer algo como '@ Html.Raw (ViewBag.CustomerJSON) + '';' Debido a que el validador de JavaScript espera números enteros o texto. No hace absolutamente nada al resultado, pero elimina el garabato rojo. 'Advertencia: Usar esto en exceso podría quemar los ojos más adelante. – ppumkin

+4

Otra solución provisional:' var data = [@ Json.Encode (someObject)] [0]; 'que funciona para llamadas C# que devuelven objetos JSON, no cadenas o números. – Drewmate

+0

No aconsejaría crear matrices para cada valor de javascript simplemente para aliviar un problema de IDE. – crush

Respuesta

65

¿Esto es un error en Razor?

Absolutamente no. Ejecute su aplicación, y funcionará como se esperaba.

Es un error de los instrumentos que está utilizando (Visual Studio     2012, ReSharper, ...) que son incapaces de reconocer la sintaxis perfectamente válido y que le advierte sobre algo que no debe ser advertido acerca. Podría tratar de abrir un problema en el sitio de Microsoft Connect e indicar este error si aún no se ha hecho.

+0

¡Excelente respuesta! :) –

+2

:(¿Error de Resharper? – felickz

+0

Parece que hay un error de conexión aquí: https://connect.microsoft.com/VisualStudio/feedback/details/777108/syntax-parse-error-on-javascript-asp- net-razor-view –

24

Como esto parece estar sucediendo y es una molestia, pensé que al menos les haría saber a los demás lo que terminé usando como un "truco". No quiero ignorar la advertencia y preferiría aceptar una sintaxis hokier (y sí, alguien va a decir que esto matará el rendimiento :))

Lo que uso como solución es usar una adición del lado del cliente en el fin. Para mí se produjo el error en la definición de un "número entero" constante, de modo

window.foo = @(Model.Something); 

me dio la buena error de coma de edad. Simplemente cambió por:

window.foo = @Model.Something + 0; 

(En el caso de preguntas declarado que sólo debe ser capaz de añadir '', por lo que + ''

Sé que es un todo otra adición sucediendo en el cliente. y no es elegante, pero evita el error. Por lo tanto, úselo o no, pero prefiero esto más que ver la advertencia/error.

Si alguien sabe de una solución sintáctica del lado del servidor para esto I preferiría esto al lado del cliente, así que por favor agregue.

+7

para el caso general, simplemente puede hacer: window.foo = [@ Model.Something] [0] – andrewjs

+0

He adaptado esta respuesta para cadenas; @ Html.Raw (Json.Encode (Model.Where (m => m.Apply))) + "", – Darren

+0

@andrewjs ¿Le recomendamos crear una matriz para evitar estos errores IDE? No es una buena práctica en absoluto. – crush

3

Esto funcionó para mí :

var customer = @Html.Raw(ViewBag.CustomerJSON + ";") 
+0

Esto funciona a menos que tenga dos declaraciones 'var' en una fila. Entonces Razor se asusta con el segundo. – Paul

1

Aquí es una solución para los booleanos:

var myBool = @(Model.MyBool ? "true;" : "false;") 
1

Esto funcionó para mí

@Html.Raw(string.Format("var customer = {0};", ViewBag.CustomerJSON)); 
7

me encontré con que envolver la sintaxis Razor en una función de identidad JavaScript también hace que el IDE feliz.

<script type="text/javascript"> 
    @* I stands for Identity *@ 
    function I(obj) { return obj; } 
    $().ready(function(){ 
     var customer = I(@Html.Raw(ViewBag.CustomerJSON)); 
    }); 
</script> 
+1

Esto es básicamente lo que fuimos internamente también. Llamamos a la función 'Razor (obj)' though. – crush

+0

@crush Creé una función Razor como lo hizo, pero entonces, ¿por qué no puede simplemente poner parens alrededor del valor? 'var i = (@ ViewBag.value);'? – Nate

+0

@Nate Eso puede funcionar. Me actualicé a VS2013, donde el problema se soluciona de todos modos, por lo que ya no puedo probarlo. – crush

0
<script type="text/javascript"> 
    $().ready(function(){ 
     var customerName = ('@ViewBag.CustomerName'); // <- wrap in parens 
    }); 
</script> 

¿No es tan simple como envolver paréntesis? Poner valores a través de la consola parece funcionar bien sin ningún efecto secundario.

Funciona para cadenas, pero todavía da el error para valores no citados, pero todavía me gusta esto para valores de cadena. Para los números, puede usar parseInt('@Model.TotalResultCount', 10).

Cuestiones relacionadas