我使用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>
它编译得很好,没有任何问题,结果如预期的那样......
我做错了什么?
答案 0 :(得分: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"
答案 1 :(得分:1)
Razor检查HTML5兼容性和链接标记与内容无效,因为它是void元素。 有关HTML void elements的更多信息: 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 中的解决方案,不使用MVC Html助手
@ Html.Raw 是添加其中一个:
@(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