我在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’是上面定义为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)
...我现在陷入了一个僵局。我觉得答案是显而易见的,但我现在就是看不出来。
发布于 2009-12-21 23:48:34
好的--所以我设法让一些东西工作,但它是一个黑客,并不是一个我想要的解决方案,但它得到了一些工作。
基本上,我手动将模板加载到一个字符串中,然后将该字符串传递给velocityEngine.Evaluate()方法,该方法将结果写入给定的StringWriter。这样做的副作用是模板中的#parse指令不起作用,因为它仍然找不到文件。
using (StringWriter writer = new StringWriter())
{
velocityEngine.Evaluate(context, writer, templateName, template);
return writer.ToString();
}在上面的代码中,templateName是无关紧要的,因为它没有被使用。模板是包含已从磁盘预加载的整个模板的字符串。
我仍然会感谢任何更好的解决方案,因为我真的不喜欢这样。
发布于 2010-01-22 16:25:11
您是否考虑过使用Castle的NVelocityTemplateEngine
从"TemplateEngine Component1.1-2009年9月29日“部分下载并引用以下程序集:
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();
}其中:
我希望这对你有帮助!
为了添加,您需要将其放入一个返回字符串的静态方法中!
发布于 2010-08-20 13:09:29
最近有这个问题- 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();
}
}https://stackoverflow.com/questions/1940126
复制相似问题