首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NVelocity找不到模板

NVelocity找不到模板
EN

Stack Overflow用户
提问于 2009-12-21 21:35:10
回答 5查看 2.2K关注 0票数 4

我在ASP.NET MVC应用程序中使用NVelocity遇到了一些困难。我正在使用它作为生成电子邮件的一种方式。

据我所知,我传递的细节都是正确的,但它无法加载模板。

代码如下:

代码语言:javascript
复制
private const string defaultTemplatePath = "Views\\EmailTemplates\\";

..。

代码语言:javascript
复制
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是正确的目录,我已经将值粘贴到资源管理器中以确保它是正确的。

代码语言:javascript
复制
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方法时失败,堆栈跟踪将如下所示:

代码语言:javascript
复制
   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)
...

我现在陷入了一个僵局。我觉得答案是显而易见的,但我现在就是看不出来。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-12-21 23:48:34

好的--所以我设法让一些东西工作,但它是一个黑客,并不是一个我想要的解决方案,但它得到了一些工作。

基本上,我手动将模板加载到一个字符串中,然后将该字符串传递给velocityEngine.Evaluate()方法,该方法将结果写入给定的StringWriter。这样做的副作用是模板中的#parse指令不起作用,因为它仍然找不到文件。

代码语言:javascript
复制
using (StringWriter writer = new StringWriter())
{
    velocityEngine.Evaluate(context, writer, templateName, template);
    return writer.ToString();
}

在上面的代码中,templateName是无关紧要的,因为它没有被使用。模板是包含已从磁盘预加载的整个模板的字符串。

我仍然会感谢任何更好的解决方案,因为我真的不喜欢这样。

票数 1
EN

Stack Overflow用户

发布于 2010-01-22 16:25:11

您是否考虑过使用Castle的NVelocityTemplateEngine

从"TemplateEngine Component1.1-2009年9月29日“部分下载并引用以下程序集:

代码语言:javascript
复制
using Castle.Components.Common.TemplateEngine.NVelocityTemplateEngine;
using Castle.Components.Common.TemplateEngine;

然后,您可以简单地调用:

代码语言:javascript
复制
using (var writer = new StringWriter())
{
    _templateEngine.Process(data, string.Empty, writer, _templateContents);
    return writer.ToString();
}

其中:

  • _templateEngine是您的NVelocityTemplateEngine
  • data是您的信息字典(我正在使用字典使我能够通过键访问对象)我的template.
  • _templateContents中的$objectKeyName是实际的模板字符串本身。

我希望这对你有帮助!

为了添加,您需要将其放入一个返回字符串的静态方法中!

票数 5
EN

Stack Overflow用户

发布于 2010-08-20 13:09:29

最近有这个问题- NVelocity需要用模板文件的位置进行初始化。在本例中,mergeValues是一个匿名类型,因此在我的模板中,我只能引用$Values.SomeItem

代码语言:javascript
复制
    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();
        }
    }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1940126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档