2012-06-07 5 views
6

Abbiamo avuto una vista (.cshtml) che ha reso XML per un feed RSS utilizzando ASP.NET MVC 3, che ha funzionato correttamente. Ora che abbiamo aggiornato a ASP.NET MVC 4 con Razor 2, stiamo generando errori di compilazione, simili al seguente.ASP.NET MVC 4 e Razor 2: il motore di visualizzazione non supporta più 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? 

I tag sono correttamente bilanciati.

Qualcuno ha qualche idea?

UPDATE: ho isolato giù per la la collegamento elemento all'interno del voce elemento all'interno del @foreach (...) {...} blocco.

@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>  
} 

ho riparato facendo utilizzando @ Html.Raw sottostante.

@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>  
} 

Qualcuno ha suggerimenti migliori? Ovviamente, potrei semplicemente usare una classe per dichiarare il modello e restituire l'XML direttamente dal controller, ma sono più interessato al motivo per cui questo comportamento si verifica e cosa posso fare per conformarmi meglio alla sintassi del Razor.

+0

Potrebbe pubblicare il '' tag il messaggio di errore sta parlando? –

+0

Aggiornamento della domanda con il tag e ** a ** soluzione alternativa. qualche idea? –

risposta

8

Quando ho visto per la prima volta questo ho notato che il tag link aveva un tag di chiusura invece di chiusura automatica. Razor è smart abbastanza per sapere html e sa come il tag link è chiuso. Ecco un altro esempio di qualcosa che potrebbe rompersi per mostrare come Razor legge html.

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

    .... 

     </tr> 
</tbody> 

Ciò non riuscirà perché si vede una </tr> senza un tag di apertura.

I tag che si chiudono sempre da soli vengono interpretati da Razor come chiusura automatica. quindi il tuo tag link terminava effettivamente allo >. (dal momento che è un codice HTML valido avere un tag che si chiude automaticamente senza un />) Quindi ora ci imbattiamo in un tag di chiusura senza tag di apertura per giustificarlo così il parser si arrende e dice che non è formattato correttamente. Dovrei fare un po 'di controllo ma sono abbastanza sicuro che il tag sia stato inteso per il tag item in quanto fornirebbe il giusto equilibrio, motivo per cui il resto del file viene analizzato fino a quando non trova questo tag solo item senza tag di apertura.

Dovrebbe essere abbastanza intelligente da sapere che il tag di chiusura precedente non era quello giusto. Potrebbe essere un problema da affrontare con la squadra.

Non ho provato, ma si dovrebbe essere in grado di fare questo

@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

Quindi, questo è Razor che cerca di essere intelligente con HTML 5, poiché il mio esempio è un feed RSS in XML e non in HTML 5. L'elemento ** link ** non è un elemento di chiusura automatica in questo caso. –

+0

Questo spiega il comportamento, ma non una soluzione. (Non cercare di essere difficile da ottenere, ma altri vorranno sapere cosa fare in questa situazione.) Esiste una buona soluzione per disattivare Razor dal conformarsi alle regole di sintassi dell'elemento HTML 5 durante la compilazione? –

+0

Capito, hai detto 'ma sono più interessato al motivo per cui questo comportamento si verifica e cosa posso fare per conformarmi meglio alla sintassi del Rasoio. Che è quello che stavo tentando di fare :) – Buildstarted