Рендеринг электронной почты вызывает исключение TemplateCompilationException с использованием RazorEngine 3 в проекте, отличном от MVC.

Я пытаюсь отображать электронные письма на хосте службы Windows.

Я использую RazorEngine 3, разветвленный coxp, который поддерживает 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))

но это делает шаблон очень нечитаемым и трудным для передачи в отдел маркетинга для дальнейшей стилизации.

Я хотел бы добавить, что ссылка на RazorEngine с помощью пакета Nuget не является решением, поскольку он основан на Razor 1, и где-то в процессе DLL для system.web.razor заменяется версией 2, которая ломает любой код с использованием RazorEngine. Кажется более интересным использовать Razor 2, чтобы пользоваться новыми функциями и быть в курсе последних событий.

Любые предложения о том, как это исправить, были бы замечательными. Делиться своим опытом тоже очень приветствуется.

ОБНОВЛЕНИЕ 1

Кажется, вызов SetTemplateBaseType может помочь, но этого метода больше не существует, поэтому мне интересно, как можно привязать тип шаблона?

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

person Guillaume Schuermans    schedule 03.01.2013    source источник


Ответы (2)


Я использую Windsor для внедрения службы шаблонов, а не использую объект Razor. Вот упрощенная часть кода, которая показывает, как установить базовый тип шаблона.

    private static ITemplateService CreateTemplateService()
    {
        var config = new TemplateServiceConfiguration
                         {
                             BaseTemplateType = typeof (HtmlTemplateBase<>),
                         };
        return new TemplateService(config);
    }
person coxp    schedule 03.01.2013
comment
Работает отлично! Большое спасибо. - person Guillaume Schuermans; 03.01.2013

RazorEngine 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);
    }
person Alexander Shagin    schedule 26.02.2014