2012-06-07 38 views
6

Teníamos una vista (.cshtml) que representaba XML para una fuente RSS utilizando ASP.NET MVC 3, que funcionaba bien. Ahora que hemos actualizado a ASP.NET MVC 4 con Razor 2, está generando errores de compilación, similares a los que se muestran a continuación.ASP.NET MVC 4 y Razor 2: View Engine ya no es compatible con xml?

Parser Error 

Description: An error occurred during the parsing of a resource required to service this request. Please review the following specific parse error details and modify your source file appropriately. 

Parser Error Message: Encountered end tag "item" with no matching start tag. Are your start/end tags properly balanced? 

Las etiquetas están correctamente equilibradas.

¿Alguien tiene alguna idea?

ACTUALIZACIÓN: He aislado hacia abajo el elemento de laenlace dentro del elemento deartículo dentro de la @foreach (...) {...} bloque.

@foreach (var item in Model.Items) 
{ 
<item> 
    <title>@item.Title</title> 
    <link>@item.Link</link> 
    <description>@item.Description</description> 
    <guid>@item.Guid</guid> 
    @if (item.PublishedDateUtc.HasValue) 
    { 
    <pubDate>@item.PublishedDateUtc.Value.ToString("ddd, dd MMM yyyy HH:mm:ss") GMT</pubDate> 
    } 
</item>  
} 

me fijo haciendo uso de @ Html.Raw el siguiente.

@foreach (var item in Model.Items) 
{ 
<item> 
    <title>@item.Title</title> 
    @Html.Raw(string.Format("<link>{0}</link>", item.Link.ToHtmlEncoded())) 
    <description>@item.Description</description> 
    <guid>@item.Guid</guid> 
    @if (item.PublishedDateUtc.HasValue) 
    { 
    <pubDate>@item.PublishedDateUtc.Value.ToString("ddd, dd MMM yyyy HH:mm:ss") GMT</pubDate> 
    } 
</item>  
} 

¿Alguien tiene alguna sugerencia mejor? Obviamente, podría usar una clase para declarar el modelo y devolver el XML directamente desde el controlador, pero estoy más interesado en por qué ocurre este comportamiento y qué puedo hacer para conformarme mejor a la sintaxis de Razor.

+0

Podría publicar la '' Tag el mensaje de error está hablando? –

+0

Se actualizó la pregunta con la etiqueta y ** a ** solución provisional. ¿Alguna idea? –

Respuesta

8

La primera vez que miré esto noté que su etiqueta link tenía una etiqueta de cierre en lugar de cierre automático. Razor es inteligente suficiente para conocer html y sabe cómo se cierra la etiqueta de enlace. Aquí hay otro ejemplo de algo que podría romperse para mostrar cómo Razor lee html.

.... 
<tbody> 
    @if (alternating) { 
     <tr class='alternating'> 
    } else { 
     <tr> 
    } 

    .... 

     </tr> 
</tbody> 

Este fallará porque ve un </tr> sin una etiqueta de apertura.

Las etiquetas que siempre se cierran automáticamente son interpretadas por Razor como autorrellentes. por lo que su etiqueta link en realidad terminó en el >. (dado que es un html válido para tener una etiqueta de cierre automático sin un />) Entonces ahora encontramos una etiqueta de cierre sin etiqueta de apertura para justificarla, por lo que el analizador se da por vencido y dice que no está formateado correctamente. Tendría que hacer algunas comprobaciones, pero estoy bastante seguro de que asume que la etiqueta de cierre link está pensada para la etiqueta item, ya que eso daría el equilibrio adecuado, por lo que el resto del archivo analiza bien hasta que aparece esta etiqueta item sin etiqueta de apertura

Debe ser lo suficientemente inteligente como para saber que la etiqueta de cierre anterior no era la correcta. Podría ser un problema hablar con el equipo.

no lo han intentado, pero usted debería ser capaz de hacer esto

@foreach (var item in Model.Items) 
{ 
<item> 
    <title>@item.Title</title> 
    @:<link> 
     @item.Link 
    @:</link> 
    <description>@item.Description</description> 
    <guid>@item.Guid</guid> 
    @if (item.PublishedDateUtc.HasValue) 
    { 
    <pubDate>@item.PublishedDateUtc.Value.ToString("ddd, dd MMM yyyy HH:mm:ss") GMT</pubDate> 
    } 
</item>  
} 
+0

Por lo tanto, esto es Razor tratando de ser inteligente con HTML 5, ya que mi ejemplo es una fuente RSS en XML y no HTML 5. El elemento ** link ** no es un elemento de cierre automático en este caso. –

+0

Esto explica el comportamiento, pero no una solución. (No tratando de ser difícil de conseguir, pero otros querrán saber qué hacer en esta situación). ¿Existe una buena solución para desactivar Razor de cumplir con las reglas de sintaxis de los elementos HTML 5 al compilar? –

+0

Entendido, usted indicó 'pero estoy más interesado en por qué ocurre este comportamiento y qué puedo hacer para conformarme mejor a la sintaxis de Razor' que es lo que estaba intentando hacer :) – Buildstarted