6

我们有一个视图 (.cshtml),它使用 ASP.NET MVC 3 为 RSS 提要呈现 XML,效果很好。现在我们已经升级到带有 Razor 2 的 ASP.NET MVC 4,它会产生编译错误,类似于下面。

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?

标签是适当平衡的。

有人有什么想法吗?

更新:我已将其隔离在 @foreach (...) { ... } 块中item元素内的链接元素中。

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

我通过使用下面的@Html.Raw来修复它。

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

有人有更好的建议吗?显然,我可以只使用一个类来声明模型并直接从控制器返回 XML,但我更感兴趣的是为什么会发生这种行为以及我可以做些什么来更好地符合 Razor 语法。

4

1 回答 1

9

当我第一次看到这个时,我注意到你的link标签有一个结束标签而不是自闭标签。Razor足够聪明,可以知道 html 并且知道链接标签是如何关闭的。这是另一个可能会破坏以显示 Razor 如何读取 html 的示例。

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

    ....

        </tr>
</tbody>

这将失败,因为它看到 a</tr>没有开始标签。

Razor 将始终自关闭的标签解释为自关闭。所以你的link标签实际上以>. (因为它是有效的 html 有一个没有 a 的自结束标签/>)所以现在我们遇到一个没有开始标签的结束标签来证明它是合理的,所以解析器放弃并说它的格式不正确。我必须做一些检查,但我很确定它假定结束link标签是用于item标签的,因为这会提供适当的平衡,这就是为什么文件的其余部分解析得很好,直到遇到这个item没有打开的单独标签标签。

它应该足够聪明,知道前一个结束标签不是正确的。与团队合作可能是一个问题。

我还没有尝试过,但你应该能够做到这一点

@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>      
}
于 2012-06-07T15:42:29.027 回答