c# - 如果模板中的最后一个字符是 $,NVelocity 合并失败

标签 c# nvelocity

我在使用 CaSTLe NVelocity 时遇到了一个奇怪的问题...

如果模板字符串以 $ 字符结尾,则会抛出以下异常:

Lexical error: NVelocity.Runtime.Parser.TokenMgrError: Lexical error at line 1, column 94. Encountered: after : ""

如果我在字符串末尾添加空格或任何其他字符,它会按预期工作。

有人有解决办法吗?

下面是一些重现该问题的示例代码:

class Program
{
    static void Main(string[] args)
    {
        var result = Merge("The quick brown ${Animal} jumps over the lazy dog$", new List<KeyValuePair<string, string>>() { new KeyValuePair<string, string>("Animal", "fox") });

        Console.WriteLine("Success: {0}", result.Key);
        Console.WriteLine("Message: {0}", result.Value);
        Console.Read();
    }

    public static KeyValuePair<bool, string> Merge(string template, IList<KeyValuePair<string, string>> data)
    {
        var ret = new KeyValuePair<bool, string>(false, null);
        try
        {
            if (data != null)
            {
                var engine = new VelocityEngine();
                engine.Init();

                var context = new VelocityContext();
                foreach (var tokenData in data)
                {
                    context.Put(tokenData.Key, tokenData.Value);
                }

                var templateContent = template;

                var sb = new StringBuilder();
                var textWriter = new StringWriter(sb);

                engine.Evaluate(context, textWriter, String.Empty, templateContent);

                ret = new KeyValuePair<bool, string>(true, sb.ToString());
            }
        }
        catch (Exception ex)
        {
            ret = new KeyValuePair<bool, string>(false, ex.Message);
        }
        return ret;
    }
}

最佳答案

您有几个选择:

如果您对要合并的输入字符串没有影响,请确保它们没有尾随美元字符,至少在合并过程中没有:

示例:

bool dollarAtEnd = false;

if (input.EndsWith('$'))
{
   input += " "; 
   dollarAtEnd = true;
}

var result = Merge(input, ...);

if (dollarAtEnd)
{
   result = result.Substring(1, result.Length - 1);
}

如果你可以控制输入字符串,但只要求其中一些字符串以美元字符结尾,你可以这样做:

示例:

"#set($dollar='$')The quick brown ${Animal} jumps over the lazy dog$dollar"

或者将“dollar”作为变量传递给 VelocityContext,而不是内联指定它。

关于c# - 如果模板中的最后一个字符是 $,NVelocity 合并失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10429038/

相关文章:

c# - 如何多目标 SilverLight 4 和 WPF 应用程序?

c# - MvvmCross Android EditText 绑定(bind)不更新屏幕

c# - 如何在 IE 保护模式下访问 AppData(从托管 BHO)

asp.net - NVelocity 找不到模板

.net - NVelocity 项目死了吗?有替代品吗?

c# - "if x in array"的 nvelocity/C# 等价物是什么?

c# - Visual Studio 2015 中的 Azure Web 作业 - 部署无法正常工作,出现错误 "target "MSDeployPublish“项目中不存在”。

播放 YouTube 的 C# LibVLCSharp 问题

.net - 自动 HTML 编码 NVelocity 输出(EventCartridge & ReferenceInsert)

c# - 将 NVelocity 与 Sitecore FieldRenderer 结合使用