4

ASP.NETMVCアプリケーションで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)
...

私は今少し行き詰まっています。答えはやみくもに明白だと思いますが、今のところわかりません。

4

5 に答える 5

5

CastleのNVelocityTemplateEngineの使用を検討しましたか?

「TemplateEngineコンポーネント1.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();
}

どこ:

  • _templateEngineはNVelocityTemplateEngineです
  • dataは情報の辞書です(私は辞書を使用して、テンプレートのキー($ objectKeyName)でオブジェクトにアクセスできるようにしています。
  • _templateContentsは、実際のテンプレート文字列そのものです。

これがお役に立てば幸いです。

追加するだけで、もちろん文字列を返す静的メソッドにそれを入れたいと思うでしょう!

于 2010-01-22T08:25:11.007 に答える
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();
        }
    }
于 2010-08-20T05:09:28.650 に答える
2

file.resource.loader.pathを設定してみてください

http://weblogs.asp.net/george_v_reilly/archive/2007/03/06/img-srchttpwwwcodegenerationnetlogosnveloc.aspx

于 2010-05-24T23:20:47.450 に答える
1

わかりました-それで、私はなんとか機能するようになりましたが、それはちょっとしたハックであり、私が望む解決策にはほど遠いですが、それは何かが機能するようになりました。

基本的に、テンプレートを手動で文字列にロードし、その文字列をvelocityEngine.Evaluate()メソッドに渡します。このメソッドは、指定されたStringWriterに結果を書き込みます。これの副作用は、テンプレート内の#parse命令がまだファイルを見つけることができないため、機能しないことです。

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

上記のコードでは、templateNameは使用されていないため、関係ありません。templateは、ディスクからプリロードされたテンプレート全体を含む文字列です。

私は本当にこれが好きではないので、私はまだより良い解決策をいただければ幸いです。

于 2009-12-21T15:48:33.877 に答える
0

テストは究極の権威です:

http://fisheye2.atlassian.com/browse/castleproject/NVelocity/trunk/src/NVelocity.Tests/Test/ParserTest.cs?r=6005#l122

または、NVelocityの薄いラッパーであるTemplateEngineコンポーネントを使用して、作業を簡単にすることもできます。

于 2009-12-31T21:44:39.147 に答える