0

添加具有如下值的字典:

Dictionary<string, string> CustomArray = new Dictionary<string, string>();
CustomArray.Add("customValue1", "mydata");
this.velocityContext.Put("array", CustomArray);

像这样使用模板引擎:

Velocity.Init();  
string template = FileExtension.GetFileText(templateFilePath);
var sb = new StringBuilder();

using(StringWriter sw = new StringWriter(sb))
{
    using(StringReader sr = new StringReader(template))
    {
        Velocity.Evaluate(
           this.velocityContext,
           sw,
           "test template",
           sr);
    }
 }
 return sb.ToString();

在这样的模板中访问:

$array.Get_Item('customValue1')

$array.Get_Item('customValue2')

customValue1 检索得很好,但 customValue2 抛出 KeyNotFoundException 因为字典中不存在该键。如何在不删除引发 KeyNotFoundException 的行的情况下仍生成模板?

我查看了 Apache Velocity 指南,但我不确定如何附加它(https://velocity.apache.org/tools/devel/creatingtools.html#Be_Robust

4

1 回答 1

2

这看起来像是 NVelocity 处理 .NET 的一个缺陷Dictionary<K,V>。由于 NVelocity 在 Java 支持泛型之前起源于 Velocity,并且因为 NVelocity 是一个旧代码库,所以我尝试使用非泛型Hashtable并且它按预期工作。由于地图不是在 NVelocity 模板中键入的,因此切换类以解决此缺陷应该是一个改变。

随意记录缺陷,但如果没有拉取请求,它不太可能被修复。

VelocityEngine velocityEngine = new VelocityEngine();
velocityEngine.Init();

Hashtable dict = new Hashtable();
dict.Add("customValue1", "mydata");

VelocityContext context = new VelocityContext();
context.Put("dict", dict);

using (StringWriter sw = new StringWriter())
{
    velocityEngine.Evaluate(context, sw, "",
        "$dict.get_Item('customValue1')\r\n" +
        "$dict.get_Item('customValue2')\r\n" +
        "$!dict.get_Item('customValue2')"
    );

    Assert.AreEqual(
        "mydata\r\n" +
        "$dict.get_Item('customValue2')\r\n" +
        "",
        sw.ToString());
}
于 2014-01-15T12:05:45.117 回答