NVelocity ASP.NET Примеры - PullRequest
       8

NVelocity ASP.NET Примеры

3 голосов
/ 17 марта 2010

Я хочу использовать NVelocity в своем приложении ASP.NET MVC, а не в качестве движка представления, просто для рендеринга некоторых шаблонов электронной почты.

Тем не менее, я не могу на всю жизнь заставить его работать. Я скачал его из проекта замка и последовал примеру на http://www.castleproject.org/others/nvelocity/usingit.html#step1

Независимо от того, что я пытаюсь, я не могу загрузить шаблон, расположенный на моем сайте. В примере предлагается использовать абсолютный путь, который я пытался безрезультатно:

Template t = engine.GetTemplate("/Templates/TestEmail.vm");

Так что, пожалуйста, кто-нибудь может дать мне два примера. Одна из загрузки шаблона, расположенного в каталоге веб-сайта, а вторая - синтаксический анализ строковой переменной (поскольку вполне вероятно, что мои шаблоны будут храниться в базе данных).

Большое спасибо Бен

Ответы [ 3 ]

6 голосов
/ 17 марта 2010

Я использовал этот класс в одном из моих прошлых проектов:

public interface ITemplateRepository
{
    string RenderTemplate(string templateName, IDictionary<string, object> data);
    string RenderTemplate(string masterPage, string templateName, IDictionary<string, object> data);
}

public class NVelocityTemplateRepository : ITemplateRepository
{
    private readonly string _templatesPath;

    public NVelocityTemplateRepository(string templatesPath)
    {
        _templatesPath = templatesPath;
    }

    public string RenderTemplate(string templateName, IDictionary<string, object> data)
    {
        return RenderTemplate(null, templateName, data);
    }

    public string RenderTemplate(string masterPage, string templateName, IDictionary<string, object> data)
    {
        if (string.IsNullOrEmpty(templateName))
        {
            throw new ArgumentException("The \"templateName\" parameter must be specified", "templateName");
        }

        var name = !string.IsNullOrEmpty(masterPage)
            ? masterPage : templateName;

        var engine = new VelocityEngine();
        var props = new ExtendedProperties();
        props.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, _templatesPath);
        engine.Init(props);
        var template = engine.GetTemplate(name);
        template.Encoding = Encoding.UTF8.BodyName;
        var context = new VelocityContext();

        var templateData = data ?? new Dictionary<string, object>();
        foreach (var key in templateData.Keys)
        {
            context.Put(key, templateData[key]);
        }

        if (!string.IsNullOrEmpty(masterPage))
        {
            context.Put("childContent", templateName);
        }

        using (var writer = new StringWriter())
        {
            engine.MergeTemplate(name, context, writer);
            return writer.GetStringBuilder().ToString();
        }
    }
}

Чтобы создать экземпляр класса NVelocityTemplateRepository, необходимо указать абсолютный путь к корневому каталогу вашего шаблона. Затем вы используете относительные пути для ссылки на ваши vm файлы.

2 голосов
/ 17 марта 2010

Я также добавил следующий метод для обработки строки вместо файла шаблона (например, при извлечении содержимого шаблона из базы данных):

        public string RenderTemplateContent(string templateContent, IDictionary<string, object> data)
    {
        if (string.IsNullOrEmpty(templateContent))
            throw new ArgumentException("Template content cannot be null", "templateContent");

        var engine = new VelocityEngine();
        engine.Init();

        var context = GetContext(data);

        using (var writer = new StringWriter()) {
            engine.Evaluate(context, writer, "", templateContent);
            return writer.GetStringBuilder().ToString();
        }
    }

И использовал StructureMap для инициализации службы:

            ForRequestedType<ITemplateService>()
            .TheDefault.Is.ConstructedBy(()=> 
                new NVelocityTemplateService(HttpContext.Current.Server.MapPath("~/Content/Templates/")));
1 голос
/ 21 марта 2010

Может оказаться полезным TemplateEngine компонент .

Это абстракция над шаблонизаторами с реализацией NVelocity, похожая на ответ Дарина , но она должна работать незначительно лучше, поскольку использует один экземпляр VelocityEngine (в отличие от инициализации одного экземпляра для рендера) и имеет дополнительное кэширование. Он также имеет несколько других функций, таких как ведение журнала, переопределение свойств NVelocity и загрузка шаблонов из ресурсов сборки.

...