C#C
C#2y ago
Pingu

Building a Blazor `RenderFragment` in base razor component to be used in derived?

Hey. So I have a base razor component that I want to derive from multiple times, as there will be a lot of duplicated code between the multiple derivations.

One thing I have stumbled into, is that I have a title which is largely similar between all the derived components. For this, I currently have the following:

protected virtual string ObjectName => "Item";

protected RenderFragment TitleFragment() => builder =>
{
    builder.OpenComponent<MudText>(0);
    builder.AddAttribute(1, nameof(MudText.Typo), Typo.h6);
    builder.AddAttribute(2, nameof(MudText.Class), "mr-10");

    builder.AddAttribute(3, nameof(MudText.ChildContent), (RenderFragment) ((builder2) =>
    {
        builder2.OpenComponent<MudIcon>(4);
        builder2.AddAttribute(5, nameof(MudIcon.Class), "mr-3 mb-n1");
        if (IsCreating)
            builder2.AddAttribute(6, nameof(MudIcon.Icon), Icons.Material.Filled.Add);
        else
            builder2.AddAttribute(6, nameof(MudIcon.Icon), Icons.Material.Filled.Edit);
        builder2.CloseComponent();
        if(IsCreating)
            builder2.AddContent(7, $"Create {ObjectName}");
        else
            builder2.AddContent(7, $"Edit {ObjectName}");
    }));
    builder.CloseComponent();
};


This works, and in my derived razor components I can invoke TitleFragment() and get the title that I desire. However, I wasn't sure if there was a way to create a RenderFragment in such a way without using the RenderTreeBuilder? Can I instead somehow declare this as razor syntax somewhere within my base razor component, or is this my only option?
Was this page helpful?