web-dev-qa-db-ja.com

RazorEngineを使用するときに生のhtmlを出力するにはどうすればよいですか(MVCからではありません)

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でエンコードされていますが、デコードする必要があります。どうすればこれを達成できますか?

96
KallDrexx

RazorEngineは、MVCのRazor View Engineと同様に、テンプレートに書き込まれた値を自動的にエンコードします。これを回避するために、デフォルトの実装がIEncodedStringおよびHtmlEncodedStringであるRawStringというインターフェイスを導入しました。

後者を使用するには、単にRawの組み込みTemplateBaseメソッドを呼び出します。

@Raw(Model.EmailContent)
168
Matthew Abbott

参考までに、ここには@ Html.Raw(...)構文を含むフォークがあります。

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

12
Tod Thomson

私はRazorEngine 3.8.2を使用しており、@Raw(Model.Content)は完全に正常に機能しています。

3
curious.netter

テンプレートのカスタム基本クラスがある場合、通常のMVCテンプレートと同様に動作するようにWriteメソッドをコーディングできます。出力値が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);
}
2
Iravanchi

@Html.Raw()および@Html.Partial()のサポートを追加するRazorEngineのラッパーを構築しました

https://github.com/b9chris/RazorEngineComplete

0
Chris Moschini