0

我有这个使用 RazorEngine v 3.4.1 的模板:

@{ var Title = Model.Page.Title ;
                   var Description = Model.Page.Description;
                   var Articles = Model.Site.Articles;
                   var SiteUrl = Model.Site.WebsiteUrl;
             }
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
 <title>@Title</title>
 <description>@Description</description>
 <link>@SiteUrl</link>
 <lastBuildDate>@DateTime.Now</lastBuildDate>
 <pubDate>@DateTime.Now</pubDate>

@foreach(var Article in Articles){
  <item>
    <title>@Article.Title</title>
    <description>@Article.Description</description>
    <link>@Article.Url</link>
    <guid>@Article.Url</guid>
    <pubDate>@Article.Date.ToString()</pubDate>
  </item>
}
</channel>
</rss>

当我尝试编译它时,它会抛出TemplateParsingException说:

“item”元素没有关闭。所有元素必须是自闭合的或具有匹配的结束标记。

当我从模板中删除这一行时:

<link>@Article.Url</link>

它编译得很好,没有任何问题,结果符合预期......

我究竟做错了什么?

4

2 回答 2

1

MS 在 Razor 2 中添加了对 HTML5 void 元素的支持,这就是您看到此问题的原因。最简单的解决方案是转义标签,以便 Razor 将它们视为文字,即@:

这适用的元素的完整列表是(取自 System.Web.Razor.Parser.HtmlMarkupParser)

    "area",
    "base",
    "br",
    "col",
    "command",
    "embed",
    "hr",
    "img",
    "input",
    "keygen",
    "link",
    "meta",
    "param",
    "source",
    "track",
    "wbr"
于 2014-03-31T15:11:03.270 回答
1

Razor 检查 HTML5 兼容性,并且带有内容的链接标记无效,因为它是 void 元素。有关 HTML void 元素的更多信息: http ://w3c.github.io/html-reference/syntax.html#void-element

以下是 HTML 中 void 元素的完整列表:

area, base, br, col, command, embed, hr, img, input, keygen, link, meta, param, source, track, wbr


在 RazorEngine 中不使用像 @Html.Raw 这样的 MVC Html Helpers的解决方案是添加以下之一:

@(new RazorEngine.Text.RawString("<link>" + Article.Url + "</link>"))

@Raw("<link>" + Article.Url + "</link>")


另外,如果您想使用 @Html.Raw 之类的语法,您可以使用自己的类扩展模板语法,如文档https://matthid.github.io/RazorEngine/TemplateBasics.html#Extending-the-template-Syntax

于 2015-11-06T08:34:26.627 回答