2012-10-02 10 views
6

Razor 2 (que se envía con MVC4) no parece ser completamente compatible con Razor 1 (desde MVC3).Error "Elemento no cerrado" después de actualizar de MVC3 a MVC4

Desde la actualización, me encontré con un error:

The "[email protected](count" element was not closed. All elements must be either self-closing or have a matching end tag.

El código que causó esta era:

<[email protected](count == null ? null : " class='has-item'")> 

¿Cuál es la solución a esto?

Respuesta

14

la navaja analizador fue re-escrito para MVC 4, presumably because:

The HTML5-specs clearly states that unclosed HTML-tags are supported, but Razor v1 didn't have an advanced enough parser to support this. Razor v2 now supports this with the elements listed in W3C's spec.

La solución más simple es el de aportar un solo espacio antes del símbolo @:

<td @Html.Raw(count == null ? null : " class='has-item'")> 

atributos Sin embargo, condicionales en Razor con MVC 4 tienen una sintaxis más elegante.

<td class="@(count == null ? null : "has-item")"> 

Cuando un valor de atributo se resuelve a null, el atributo se omite el elemento. Por lo que la salida de este margen de beneficio es o bien:

<td> 

... o ...

<td class="has-item"> 
1

El analizador de la maquinilla de afeitar de MVC4 es diferente de MVC3. Razor v3 tiene funciones de analizador avanzado y, por otro lado, un análisis estricto en comparación con MVC3.

Puede experimentar un error de sintaxis a la vista al convertir MVC3 a MVC4 si no ha utilizado la sintaxis de la afeitadora de la manera correcta.

Solución de algunos errores de afeitar de códigos comunes que no están permitidos en la maquinilla de afeitar v2 son:

-> Evitar el uso de bloques de servidor en vistas a menos que exista sección de declaración de variables.

Don’t : @{if(check){body}} 
Recommended : @if(check){body} 

-> Evite utilizar @ cuando ya se encuentre en el alcance del servidor.

Don’t : @if(@variable) 
Recommended : @if(variable) 

Don't : @{int a = @Model.Property } 
Recommended : @{int a = Model.Property } 
Cuestiones relacionadas