2

I have a .NET 8 Blazor web app that uses per-page rendering (nothing set globally) which renders my nav bar and main layout statically on the server. I navigate to a razor component page that sets the render mode at the component level (@rendermode InteractiveWebAssembly). If I try to use PersistentComponentState inside OnInitializedAsync(), I get the following error:

InvalidOperationException: The registered callback b__0 must be associated with a component or define an explicit render mode type during registration.

How do I explicitly register my component state when navigating to my component from a statically rendered parent?

If I set the render mode globally in App.razor, my code works fine. I'd prefer to per-page rendering but I want to be able to handle the pre-render correctly without calling my database twice.

Here's my navlink:

<AuthorizeView>
    <Authorized>                
        <div class="nav-item px-3">
            <NavLink class="nav-link" href="map">                        
                <span class="bi bi-map-fill-nav-menu" aria-hidden="true"></span> Map                        
            </NavLink>
        </div>
    </Authorized>            
</AuthorizeView>

My component:

@inject PersistentComponentState ApplicationState
@rendermode InteractiveWebAssembly
...
@code {
   private PersistingComponentStateSubscription subscription;
   ...

protected override async Task OnInitializedAsync()
{    
    cts = new CancellationTokenSource();

    subscription = ApplicationState.RegisterOnPersisting(() =>
    {
        ApplicationState.PersistAsJson("MapInit", MapInitialization);
        return Task.CompletedTask;
    });

    if (ApplicationState.TryTakeFromJson("MapInit", out MapInitialization? storedData))
    {
        MapInitialization = storedData;
    }
    else
    {
        MapInitialization = await GrsService.GetMapInitialization(cts.Token);

        if (MapInitialization is not null)
        {
            MapInitialization.Plants = await GrsService.GetPlants(MapInitialization.MapSettings?.VisiblePlants, cts.Token);

        }
    }
    ...
}

}

1 Answer 1

1

There's an IComponentRenderMode parameter inside the RegisterOnPersisting() method that gives you the ability to set the rendermode per subscription:

subscription = ApplicationState.RegisterOnPersisting(() =>
{
    ApplicationState.PersistAsJson("MapInit", MapInitialization);
    return Task.CompletedTask;
}, RenderMode.InteractiveWebAssembly);
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.