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

时间:2012-03-12 02:49:05

标签: 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.EmailContent))
    </body>
</html>

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

6 个答案:

答案 0 :(得分:165)

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

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

@Raw(Model.EmailContent)

答案 1 :(得分:12)

仅供参考我有一个包含@ Html.Raw(...)语法的fork:

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

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

答案 4 :(得分:0)

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

https://github.com/b9chris/RazorEngineComplete

答案 5 :(得分:-1)

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

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


  @MvcHtmlString.Create(res)

  @Html.Raw(res)