Handlebars-Net / Handlebars.Net

A real .NET Handlebars engine
MIT License
1.24k stars 214 forks source link

@partial-block not working as partial block or as conditional #519

Open stellR42 opened 2 years ago

stellR42 commented 2 years ago

Describe the bug

I'm trying to register a partial that can either be used as a block, with block content, or inline without content. However, both methods I tried using to accomplish this aren't working because @partial-block doesn't seem to be properly recognized. The only way I can get @partial-block to render is by using {{> @partial-block}} on it's own. Both of the following cases don't render anything:

Block:

{{#> @partial-block }}
{{/@partial-block}}

Conditional:

 {{#if @partial-block}}
  {{> @partial-block}}
  {{/if}}

Expected behavior:

@partial-block should be recognized in both the above scenarios and render the block content if it is provided.

Test to reproduce

[Fact]
public void Descriptive_Test_Name_Here()
{
      var template = @"
{{#> myPartial}}
Block content
{{/myPartial}}";
            var partial =
                @"  
Conditional:
  {{#if @partial-block}}
  {{> @partial-block}}
  {{/if}}
Plain:
  {{> @partial-block}}
Block:
{{#> @partial-block }}
{{/@partial-block}}";
            var handlebars = Handlebars.Create();
            handlebars.RegisterTemplate("myPartial", partial);
            var render = handlebars.Compile(template);
            object data = new { };
            var actual = render(data);
            Assert.Equal("Conditional: Block content Plain: Block content Block: Block content", actual);
}
oformaniuk commented 2 years ago

The problem is in the implementation of @partial-block itself. Right now it is not implemented as a property of the context. I see couple ways to fix it: