使用 RazorEngine (不是 MVC)时如何输出原始 html

我试图用 HTML 内容生成电子邮件。这些内容已经通过卫生检查,所以我不担心这方面的问题,但是,当我呼吁:

Razor.Parse(template, model);

在下面的剃刀模板:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<body>
@(new System.Web.HtmlString(Model.EmailContent))
</body>
</html>

输出的电子邮件是 HTML 编码的,但我需要它解码。我怎样才能做到这一点?

70776 次浏览

RazorEngine 与 MVC 的 RazorViewEngine 一样,将自动对写入模板的值进行编码。为了解决这个问题,我们引入了一个名为 IEncodedString的接口,其默认实现是 HtmlEncodedStringRawString

要使用后者,只需调用 TemplateBase的内置 Raw方法:

@Raw(Model.EmailContent)

对了,我这里有一个 fork,其中包含@Html. Raw (...)语法:

Https://github.com/antaris/razorengine/pull/105

如果您的模板有一个自定义的基类,您可以编码 Write方法,使其行为类似于普通的 MVC 模板: 如果输出值是 IHtmlString,则不应该对其进行编码。

下面是我在 TemplateBase类中使用的代码:

// Writes the results of expressions like: "@foo.Bar"
public virtual void Write(object value)
{
if (value is IHtmlString)
WriteLiteral(value);
else
WriteLiteral(AntiXssEncoder.HtmlEncode(value.ToString(), false));
}


// Writes literals like markup: "<p>Foo</p>"
public virtual void WriteLiteral(object value)
{
Buffer.Append(value);
}

我使用的是 RazorEngine 3.8.2,而 @Raw(Model.Content)对我来说非常好用。

为 RazorEngine 构建了一个包装器,增加了对 @Html.Raw()@Html.Partial()的支持

Https://github.com/b9chris/razorenginecomplete