使用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与MVC的Razor视图引擎一样,将自动对写入模板的值进行编码。为了解决这个问题,我们引入了一个名为IEncodedString
的接口,默认实现为HtmlEncodedString
和RawString
。
要使用后者,只需调用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