我们有一个视图(.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语法.
解决方法
当我第一眼看到这个时,我注意到你的链接标签有一个结束标签而不是自动关闭. Razor非常聪明,可以知道html并知道链接标记是如何关闭的.这是另一个可以打破以显示Razor如何读取html的例子.
.... <tbody> @if (alternating) { <tr class='alternating'> } else { <tr> } .... </tr> </tbody>
这将失败,因为它看到< / tr>没有开口标签.
Razor将自动关闭的标签解释为自动关闭.所以你的链接标签实际上以>结束了. (因为它是有效的html,有一个没有/>的自闭标签)所以现在我们遇到一个没有开始标记的结束标记来证明它是合理的,所以解析器放弃并说它没有正确格式化.我必须做一些检查,但我很确定它假设关闭链接标记用于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> }