C# 使用RazorEngine(不是从MVC)时如何输出原始html
我正在尝试生成包含HTML内容的电子邮件。此内容已通过卫生处理,因此我不担心这方面的问题,但当我打电话时:C# 使用RazorEngine(不是从MVC)时如何输出原始html,c#,razor,html-encode,C#,Razor,Html Encode,我正在尝试生成包含HTML内容的电子邮件。此内容已通过卫生处理,因此我不担心这方面的问题,但当我打电话时: Razor.Parse(template, model); 在以下Razor模板上: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <body> @(new System.Web.HtmlString(Model.EmailConten
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>
@(新System.Web.HtmlString(Model.EmailContent))
输出的电子邮件是HTMl编码的,但我需要解码。如何实现这一点?RazorEngine与MVC的Razor视图引擎一样,将自动对写入模板的值进行编码。为了解决这个问题,我们引入了一个名为
IEncodedString
的接口,默认实现是HtmlEncodedString
和RawString
要使用后者,只需调用TemplateBase
的内置Raw
方法:
@Raw(Model.EmailContent)
仅供参考,我有一个fork,其中包含@Html.Raw(…)语法:
如果模板有自定义基类,则可以对
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);
}
//写入表达式的结果,如:“@foo.Bar”
公共虚拟无效写入(对象值)
{
如果(值为IHtmlString)
书面(价值);
其他的
WriteLiteral(AntiXssEncoder.HtmlEncode(value.ToString(),false));
}
//编写文字,如标记:“Foo”
公共虚拟void writeleral(对象值)
{
Buffer.Append(值);
}
我发现所有这些都对我有用
@{var myHtmlString = new HtmlString(res);}
@myHtmlString
@MvcHtmlString.Create(res)
@Html.Raw(res)
我正在使用RazorEngine 3.8.2,而
@Raw(Model.Content)
对我来说工作得非常好。为RazorEngine构建了一个包装器,它添加了对@Html.Raw()
和@Html.Partial()
@Matthew很抱歉重新启动,但即使编译完成,它在VS HTML编辑器中看起来并不漂亮,它也无法识别模型或原始。有什么解决方法吗?@Jeff我认为正确的方法是RazorEngine公开一个静态类Html.cs,该类有一个静态方法.Raw,这样它将处理对Html.Raw的标准调用,该调用可用于在VS Razor编辑器中获得正确的语法高亮显示。@Manfred@Raw()在RazorEngine中工作得很好(不是ASP.NET MVC的Razor;))也希望看到这个问题得到解决。这会导致整个项目无法在启用MvcBuildViews的情况下生成…HtmlEncodedString不起作用!而是使用:RawString。请看一个有效的示例!public RazorEngine.Text.ienceodedstring GetMarcaFinalDocumento(){返回新的RazorEngine.Text.RawString(“你好!”);}我回答了这个问题,但它作为重复答案被删除,因为我在这里回答了它:。。。此答案适用于MVC和RazorEngine。您使用的MVC库在razor引擎中不可用,因此这不是问题的答案。@Html.Raw()不需要预先配置。好办法,我也是。我能够在Razor代码中生成HTML标记和值,并将其传递给ViewData查看,并使用@HTML.Ras显示(ViewData[“NextEvent”]