RazorEngine奇怪编译异常

时间:2014-03-09 11:03:37

标签: c# razorengine

我使用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>

它编译得很好,没有任何问题,结果如预期的那样......

我做错了什么?

2 个答案:

答案 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