2

我正在尝试在 Windows 服务主机中呈现电子邮件。

我使用由 coxp 分叉的 RazorEngine 3,它支持 Razor 2。 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:名称“WriteAttribute”在当前上下文中不存在。因此,将字符串作为模型传入并将其放在 href 属性中会导致问题。

我可以通过以下方式更改此行来使其工作:

@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

我使用 Windsor 来注入模板服务,而不是使用 Razor 对象。这是代码的简化部分,展示了如何设置基本模板类型。

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

剃刀引擎 3.1.0

基于coxp答案的一点修改示例,没有注入:

    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 回答