Handlebars.Net升级后块助手捕获输出转字符串适配方案
Handlebars.Net 升级块助手适配方案
问题场景
升级项目依赖的 Handlebars.Net 版本时,存量注册的upper块助手出现编译兼容问题,该助手原有模板调用形式如下,因存量模板不受管控必须保留:
{upper} This will be up-cased {/upper}
旧版本实现(兼容旧版API)
private static void UpperHelper(TextWriter writer, HelperOptions options, dynamic context, params object[] parameters) { using (var stringWriter = new StringWriter()) { options.Template(stringWriter, context); writer.Write(stringWriter.ToString().ToUpper()); } }
新版API报错原因
新版 Handlebars.Net 调整了块助手的方法签名,输出对象从TextWriter改为EncodedTextWriter类型,BlockHelperOptions.Template方法仅接受EncodedTextWriter类型的写入参数,直接传入StringWriter会触发编译错误:
Cannot convert from StringWriter to EncodedTextWriter
手动构造绑定StringWriter的EncodedTextWriter实例失败,核心原因是构造该类型需要传入匹配的文本编码器参数,手动创建容易出现编码逻辑和全局配置不一致的问题。
适配实现代码
直接复用入参输出对象自带的编码器实例,创建绑定临时StringWriter的EncodedTextWriter即可,完全兼容原有模板调用形式:
private static void UpperHelper(EncodedTextWriter output, BlockHelperOptions options, Context context, Arguments arguments) { using var stringWriter = new StringWriter(); // 复用当前输出的编码器配置,创建临时写入器 using var tempWriter = new EncodedTextWriter(stringWriter, output.Encoder); // 渲染块内原始内容到临时写入器 options.Template(tempWriter, context); // 内容转大写后写入最终输出 output.Write(stringWriter.ToString().ToUpper()); }
注意事项
- 不要手动实例化自定义
ITextEncoder,直接复用output.Encoder可以保证编码逻辑和全局配置一致,兼容自定义HTML转义规则等场景 - 临时
EncodedTextWriter和StringWriter都需要用using声明释放,避免资源泄漏 - 该实现不需要修改任何存量模板,原有
{upper}块内容{/upper}的调用方式可以正常工作
内容的提问来源于stack exchange,提问作者Wilfredo Velázquez-Rodríguez
相关产品推荐
相关产品推荐

