【问题标题】:ASP.NET MVC 4 and Razor 2: View engine no longer supports xml?ASP.NET MVC 4 和 Razor 2:视图引擎不再支持 xml?
【发布时间】:2012-06-07 12:02:28
【问题描述】:

我们有一个视图 (.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 元素中的 link 元素中... } 块。

@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 语法。

【问题讨论】:

  • 你能贴出错误消息所说的&lt;/item&gt;标签吗?
  • 用标签和 a 解决方法更新了问题。有什么想法吗?

标签: xml razor rss asp.net-mvc-4


【解决方案1】:

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

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

    ....

        </tr>
</tbody>

这将失败,因为它看到一个没有开始标签的&lt;/tr&gt;

始终自关闭的标签被 Razor 解释为自关闭。所以你的link 标签实际上以&gt; 结尾。 (因为有一个没有/&gt; 的自结束标签是有效的html)所以现在我们遇到了一个没有开始标签的结束标签来证明它的合理性,所以解析器放弃并说它的格式不正确。我必须做一些检查,但我很确定它假定结束 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>      
}

【讨论】:

  • 所以,这是 Razor 试图使 HTML 5 变得聪明,因为我的示例是 XML 中的 RSS 提要,而不是 HTML 5。 link 元素不是 self在这种情况下关闭元素。
  • 这解释了行为,但不是解决方案。 (不是很难得到,但其他人会想知道在这种情况下该怎么做。)有没有一个好的解决方案可以在编译时关闭 Razor 不符合 HTML 5 元素语法规则?
  • 明白,你说but I'm more interested in why this behavior occurs and what I can do to conform better to the Razor syntax.这是我试图做的:)
  • +1。我会在此基础上接受你的回答。我会去 MVC 团队发个问题,看看能不能得到更好的整体解决方案。
  • 我在 MVC codeplex 项目上交叉发布了issue as a comment
猜你喜欢
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多