2009-12-21 6 views
4

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

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

Вот код:

private const string defaultTemplatePath = "Views\\EmailTemplates\\"; 

...

velocityEngine = new VelocityEngine(); 
basePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, defaultTemplatePath); 
ExtendedProperties properties = new ExtendedProperties(); 
properties.Add(RuntimeConstants.RESOURCE_LOADER, "file"); 
properties.Add(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, basePath); 
velocityEngine.Init(properties); 

BasePath правильный каталог, я вставил значение в проводнике, чтобы убедиться, что он правильно.

if (!velocityEngine.TemplateExists(name)) 
    throw new InvalidOperationException(string.Format("Could not find a template named '{0}'", name)); 


Template result = velocityEngine.GetTemplate(name); 

'name' above является допустимым именем в папке, определенной как basePath выше. Однако TemplateExists возвращает false. Если я комментирую, что условно, и пусть он не в состоянии по методу GetTemplate называют трассировки стека выглядит следующим образом:

at NVelocity.Runtime.Resource.ResourceManagerImpl.LoadResource(String resourceName, ResourceType resourceType, String encoding) 
    at NVelocity.Runtime.Resource.ResourceManagerImpl.GetResource(String resourceName, ResourceType resourceType, String encoding) 
    at NVelocity.Runtime.RuntimeInstance.GetTemplate(String name, String encoding) 
    at NVelocity.Runtime.RuntimeInstance.GetTemplate(String name) 
    at NVelocity.App.VelocityEngine.GetTemplate(String name) 
... 

Я теперь в немного тупике. Я чувствую, что ответ ослепительно очевиден, но сейчас я просто не вижу его.

+0

ли я нарушу некоторые неписаное правило, что тег ASP.NET MVC (среди других) был удален? –

+0

Я удалил тег asp.net, потому что это вообще не связано с asp.net. –

+0

Ummm ... Тег ASP.NET остается. Вы имели в виду ASP.NET MVC. Если это не связано с ASP.NET MVC, как это все еще связано с ASP.NET? –

ответ

1

Okay - Итак, мне удалось получить что-то работающее, но это немного взломать и не находится рядом с решением, которое я хочу, но оно что-то работает.

В принципе, я вручную загружаю шаблон в строку, а затем передаю эту строку методу velocityEngine.Evaluate(), который записывает результат в данный StringWriter. Побочным эффектом этого является то, что инструкции #parse в шаблоне не работают, потому что они все еще не могут найти файлы.

using (StringWriter writer = new StringWriter()) 
{ 
    velocityEngine.Evaluate(context, writer, templateName, template); 
    return writer.ToString(); 
} 

В коде выше templateName не имеет значения, поскольку оно не используется. template - это строка, содержащая весь шаблон, предварительно загруженный с диска.

Я по-прежнему ценю любые лучшие решения, поскольку мне это действительно не нравится.

+0

Правильно, это способ использовать базовый движок только для текста. Эту парни из Java, сумасшедшие идеи ... Именно поэтому Castle создал проект NVelocityTemplateEngine - это куча абстракции вокруг того, что вы разместили здесь. – eduncan911

5

Считаете ли вы использование Castle NVelocityTemplateEngine?

Загрузить с "TemplateEngine Component 1.1 - 29 сентября раздел, 2009" и ссылки на следующие узлы:

using Castle.Components.Common.TemplateEngine.NVelocityTemplateEngine; 
using Castle.Components.Common.TemplateEngine; 

Тогда вы можете просто вызвать:

using (var writer = new StringWriter()) 
{ 
    _templateEngine.Process(data, string.Empty, writer, _templateContents); 
    return writer.ToString(); 
} 

Где:

  • _templateEngine Ваш NVelocityTemplateEngine
  • данные - это ваш Dictio (я использую словарь, чтобы позволить мне обращаться к объектам с помощью ключа ($ objectKeyName) в моем шаблоне.
  • _templateContents - это сама строка шаблона.

Надеюсь, это поможет вам!

Просто чтобы добавить, вы хотите поместить это в статический метод, возвращающий строку, конечно!

3

Если бы этот вопрос в последнее время - NVelocity должен быть инициализирован с размещением файлов шаблонов. В этом случае mergeValues является анонимный тип так в моем шаблоне, я могу просто сослаться на $Values.SomeItem:

private string Merge(Object mergeValues) 
    { 
     var velocity = new VelocityEngine(); 
     var props = new ExtendedProperties(); 
     props.AddProperty("file.resource.loader.path", @"D:\Path\To\Templates"); 
     velocity.Init(props); 
     var template = velocity.GetTemplate("MailTemplate.vm"); 
     var context = new VelocityContext(); 
     context.Put("Values", mergeValues); 

     using (var writer = new StringWriter()) 
     { 
      template.Merge(context, writer); 
      return writer.ToString(); 
     } 
    } 
+0

Это сработало отлично для меня. благодаря – scottm

 Смежные вопросы

  • Нет связанных вопросов^_^