From 96238a934162a473d5b71fbb487e471e5af61ec2 Mon Sep 17 00:00:00 2001 From: Frank Tovar Date: Thu, 26 Feb 2026 09:04:50 +0100 Subject: [PATCH] Guard Home JS interop during prerender disposal --- RpgRoller/Components/Pages/Home.razor.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/RpgRoller/Components/Pages/Home.razor.cs b/RpgRoller/Components/Pages/Home.razor.cs index 9ee7153..75297a0 100644 --- a/RpgRoller/Components/Pages/Home.razor.cs +++ b/RpgRoller/Components/Pages/Home.razor.cs @@ -69,6 +69,7 @@ public partial class Home private Guid? EditingCharacterId { get; set; } private Guid? EditingSkillId { get; set; } private bool StateRefreshInProgress { get; set; } + private bool HasInteractiveRenderStarted { get; set; } private DotNetObjectReference? DotNetRef { get; set; } [Inject] @@ -104,6 +105,8 @@ public partial class Home protected override async Task OnAfterRenderAsync(bool firstRender) { + HasInteractiveRenderStarted = true; + if (!firstRender) { return; @@ -901,6 +904,11 @@ public partial class Home private async Task StopStateEventsAsync() { + if (!HasInteractiveRenderStarted) + { + return; + } + try { await JS.InvokeVoidAsync("rpgRollerApi.stopStateEvents"); @@ -908,6 +916,9 @@ public partial class Home catch (JSDisconnectedException) { } + catch (InvalidOperationException ex) when (IsStaticRenderInteropException(ex)) + { + } } public async ValueTask DisposeAsync() @@ -916,6 +927,11 @@ public partial class Home DotNetRef?.Dispose(); } + private static bool IsStaticRenderInteropException(InvalidOperationException exception) + { + return exception.Message.Contains("statically rendered", StringComparison.OrdinalIgnoreCase); + } + private async Task RequestAsync(string method, string path, object? payload = null) { var response = await JS.InvokeAsync("rpgRollerApi.request", method, path, payload);