Handlebars自定义比较Helper传参异常:字符串被解析为整数致比较失效
Handlebars比较Helper的字符串参数传递问题
背景
在Handlebars中,我希望比较两个值,根据是否相等输出X或Y。我已成功注册一个比较Helper:
private static string GetArgumentValue(object argument) { if (argument.GetType().Name == "UndefinedBindingResult") { return (string) argument.GetType().GetField("Value").GetValue(argument); } return argument.ToString(); } public void RegisterHelper() { Handlebars.RegisterHelper("ifCond", (output, context, arguments) => { var value1 = GetArgumentValue(arguments[0]); var operation = GetArgumentValue(arguments[1]); var value2 = GetArgumentValue(arguments[2]); var returnValue1 = GetArgumentValue(arguments[3]); var returnValue2 = GetArgumentValue(arguments[4]); switch (operation) { case "eq": output.Write(value1 == value2 ? returnValue1 : returnValue2); break; case "ne": output.Write(value1 != value2 ? returnValue1 : returnValue2); break; default: throw new Exception("ifCond: Unrecognized operation"); } }); }
我这样使用该Helper:
'{{ifCond MyData eq 01 X Y}}'
问题现象
MyData是值为"01"的变量,理论上与01比较应输出X,但实际输出Y(即判定为不相等)。原因是除第三个参数为整数类型外,其余参数均为UndefinedBindingResult类型,导致MyData("01")与1比较不相等。
问题
如何正确向Helper函数传递字符串?显然第三个参数01被解析为整数,仅传递了1。
说明:我知道自己的解释不够清晰,因为我对Handlebars的了解有限。
解决方案
要在Handlebars中传递字符串字面量作为Helper参数,必须用双引号或单引号包裹字符串。你遇到的问题是01未加引号,被Handlebars自动解析为整数1,和MyData的字符串"01"类型不匹配,导致比较不相等。
修改后的Helper调用应为:
'{{ifCond MyData eq "01" X Y}}'
另外,你的GetArgumentValue方法可以优化,避免依赖反射获取UndefinedBindingResult的Value字段(这种实现不够健壮),可以直接通过类型判断处理:
private static object GetArgumentValue(object argument) { if (argument is UndefinedBindingResult undefinedResult) { return undefinedResult.Value ?? string.Empty; } return argument?.ToString() ?? string.Empty; }
调整后,"01"会以字符串形式传入Helper,和MyData的"01"比较时结果为相等,就能正确输出X。
内容的提问来源于stack exchange,提问作者Valentin Mezev
相关产品推荐
相关产品推荐

