diff --git a/source/Handlebars.Test/IssueTests.cs b/source/Handlebars.Test/IssueTests.cs index c3454985..f857d65b 100644 --- a/source/Handlebars.Test/IssueTests.cs +++ b/source/Handlebars.Test/IssueTests.cs @@ -734,6 +734,27 @@ public void UnrecognisedExpressionThrowsOutOfMemoryException() Assert.Throws(()=> Handlebars.Compile(source)); } + // Issue: https://github.com/Handlebars-Net/Handlebars.Net/issues/539 + // Parent context (../) resolves to wrong value inside a custom block helper used within #each + [Fact] + public void Issue539_ParentContextInsideCustomBlockHelperInEach() + { + var handlebars = Handlebars.Create(); + handlebars.RegisterHelper("ifCond", (writer, options, context, parameters) => + { + if (parameters.Length == 3 && parameters[0]?.ToString() == parameters[2]?.ToString()) + options.Template(writer, context); + else + options.Inverse(writer, context); + }); + + var source = @"{{#each loop}}{{#ifCond another '===' 'value'}}{{../this.foo}}{{/ifCond}}{{/each}}"; + var template = handlebars.Compile(source); + var data = new { foo = "bar", loop = new object[] { new { another = "value" } } }; + var result = template(data); + Assert.Equal("bar", result.Trim()); + } + // Issue: https://github.com/Handlebars-Net/Handlebars.Net/issues/584 [Fact] public void Issue584_EscapedDoubleQuoteInHelperStringArgument() diff --git a/source/Handlebars/BlockHelperOptions.cs b/source/Handlebars/BlockHelperOptions.cs index 57253922..86f12813 100644 --- a/source/Handlebars/BlockHelperOptions.cs +++ b/source/Handlebars/BlockHelperOptions.cs @@ -71,7 +71,7 @@ public void Template(in EncodedTextWriter writer, object context) /// BlockHelper body /// [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void Template(in EncodedTextWriter writer, in Context context) => Template(writer, context.Value); + public void Template(in EncodedTextWriter writer, in Context context) => OriginalTemplate(writer, Frame); /// /// BlockHelper body @@ -113,7 +113,7 @@ public void Inverse(in EncodedTextWriter writer, object context) /// BlockHelper body /// [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void Inverse(in EncodedTextWriter writer, in Context context) => Inverse(writer, context.Value); + public void Inverse(in EncodedTextWriter writer, in Context context) => OriginalInverse(writer, Frame); /// /// BlockHelper body