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

本文关键字:原始 html MVC 输出 RazorEngine 何输出 使用 | 更新日期: 2023-09-27 18:27:22

我正在尝试生成包含HTML内容的电子邮件。这些内容已经通过了卫生处理,所以我在这方面并不担心,但当我打电话给时

Razor.Parse(template, model);

在以下Razor模板上:

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

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

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

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

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

@Raw(Model.EmailContent)

FYI我有一个fork,其中包含@Html.Raw(…)语法:

https://github.com/Antaris/RazorEngine/pull/105

我使用的是RazorEngine 3.8.2,@Raw(Model.Content)对我来说运行得很好。

如果您的模板有一个自定义基类,您可以对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构建了一个包装器,增加了对@Html.Raw()@Html.Partial() 的支持

https://github.com/b9chris/RazorEngineComplete