2

Windows サービス ホストで電子メールをレンダリングしようとしています。

Razor 2 をサポートする coxp によってフォークされた RazorEngine 3 を使用します。 https://github.com/coxp/RazorEngine/tree/release-3.0/src

これは、いくつかの電子メール テンプレートでは問題なく動作しますが、問題を引き起こしているものがあります。

@model string

<a href="@Model" target="_blank">Click here</a> to enter a new password for your account.

これにより CompilationException がスローされます: The name 'WriteAttribute' does not exist in the current context. そのため、文字列をモデルとして渡し、それを href-attribute に入れると問題が発生します。

この行を次のように変更することで機能させることができます。

@Raw(string.Format("<a href=\"{0}\" target=\"_blank\">Klik hier</a>.", @Model))

しかし、これによりテンプレートが非常に読みにくくなり、さらにスタイリングするためにマーケティング部門に渡すのが難しくなります。

Nuget パッケージを使用して RazorEngine を参照することは解決策ではないことを付け加えたいと思います。これは Razor 1 に基づいており、プロセスのどこかで system.web.razor の DLL がバージョン 2 に置き換えられ、RazorEngine を使用するコードが壊れるからです。Razor 2 を使用して新機能を活用し、最新の状態に保つ方が興味深いようです。

これを修正する方法についての提案は素晴らしいでしょう。体験談も大歓迎です。

更新 1

SetTemplateBaseType を呼び出すと役立つようですが、このメソッドはもう存在しないため、templatebasetype をバインドするにはどうすればよいでしょうか?

//Missing method in the new RazorEngine build from coxp.
Razor.SetTemplateBaseType(typeof(HtmlTemplateBase<>));
4

2 に答える 2

4

Razor オブジェクトを使用するのではなく、Windsor を使用してテンプレート サービスを挿入します。以下は、ベース テンプレート タイプを設定する方法を示すコードの簡略化された部分です。

    private static ITemplateService CreateTemplateService()
    {
        var config = new TemplateServiceConfiguration
                         {
                             BaseTemplateType = typeof (HtmlTemplateBase<>),
                         };
        return new TemplateService(config);
    }
于 2013-01-03T11:16:59.210 に答える
0

RazorEngine 3.1.0

インジェクションなしのcoxp answer に基づく少し変更された例:

    private static bool _razorInitialized;

    private static void InitializeRazor()
    {
        if (_razorInitialized) return;
        _razorInitialized = true;
        Razor.SetTemplateService(CreateTemplateService());
    }

    private static ITemplateService CreateTemplateService()
    {
        var config = new TemplateServiceConfiguration
            {
                BaseTemplateType = typeof (HtmlTemplateBase<>),
            };
        return new TemplateService(config);
    }

    public static string ParseTemplate(string name, object model)
    {
        InitializeRazor();

        var appFileName = "~/EmailTemplates/" + name + ".cshtml";
        var template = File.ReadAllText(HttpContext.Current.Server.MapPath(appFileName));
        return RazorEngine.Razor.Parse(template, model);
    }
于 2014-02-26T09:19:50.420 に答える