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


105

我正在尝试生成包含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编码的,但是我需要对其进行解码。我该怎么做?


我回答了这个问题,但是由于我在这里回答了它,因此它被删除了,因为它是重复的回答:stackoverflow.com/questions/23603593 / ... ...这个答案对MVC和RazorEngine都适用。
布赖恩·赖斯

Answers:


181

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

要使用后者,只需调用以下内置Raw方法TemplateBase

@Raw(Model.EmailContent)

4
@Matthew很抱歉要恢复,但是即使可以编译,它在VS HTML编辑器中看起来也不漂亮,它不再能够识别Model或Raw。任何解决方法?
Jeff

5
@Jeff我在想正确的方法是RazorEngine公开具有静态方法.Raw的静态类Html.cs,以便它将处理对Html.Raw的标准调用,这些调用可用于在VS Razor中获取正确的语法高亮编辑。
Tod Thomson

8
@Manfred @Raw()在RazorEngine中正常工作(不是ASP.NET MVC的Razor;))
Jeff

希望也解决这个问题。这将导致整个项目无法在启用
MvcBuildViews的情况下

2
“ HtmlEncodedString”不起作用!而是使用:RawString。查看有效的示例!public RazorEngine.Text.IEncodedString GetMarcaFinalDocumento(){返回新的RazorEngine.Text.RawString(“ <div>嗨!</ div>”);}
查尔斯(Charles


3

如果您的模板有一个自定义基类,则可以对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);
}

3

我正在使用RazorEngine 3.8.2,@Raw(Model.Content)对我来说工作正常。



-1

我发现所有这些都与我合作。

@{var myHtmlString = new HtmlString(res);}
@myHtmlString


  @MvcHtmlString.Create(res)

  @Html.Raw(res)

4
您正在使用剃须刀引擎无法提供的MVC库,因此这不是问题的答案。
oligofren
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.