From 935f026c759b0dd9b347e3c995b54dc0b585e956 Mon Sep 17 00:00:00 2001 From: troogs Date: Sun, 10 May 2026 19:47:39 +0200 Subject: [PATCH] Fix and harden prospect creation against Blazor runtime crashes - Handle empty numeric input safely with nullable integer binding. - Add semaphore locks to prevent double-click invocation errors on mobile. - Implement global exception handling and user notifications for prospect operations. --- .../Dialogs/EditProspectDialog.razor.cs | 26 ++++++++++++++++--- .../Pages/Prospects.razor.cs | 19 +++++++++----- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/FoodsharingSiegen.Server/Dialogs/EditProspectDialog.razor.cs b/FoodsharingSiegen.Server/Dialogs/EditProspectDialog.razor.cs index 49b2481..605f605 100644 --- a/FoodsharingSiegen.Server/Dialogs/EditProspectDialog.razor.cs +++ b/FoodsharingSiegen.Server/Dialogs/EditProspectDialog.razor.cs @@ -96,15 +96,33 @@ namespace FoodsharingSiegen.Server.Dialogs if (IsUpdateMode) { var updateR = await ProspectService.UpdateAsync(Prospect); - if (updateR.Success && OnSuccess != null) await OnSuccess.Invoke(); + if (updateR.Success) + { + if (OnSuccess != null) await OnSuccess.Invoke(); + await ModalService.Hide(); + } + else + { + await Notification.Error(updateR.Exception?.Message ?? "Unbekannter Fehler beim Speichern.", "Fehler"); + } } else { var addR = await ProspectService.AddProspectAsync(Prospect); - if (addR.Success && OnSuccess != null) await OnSuccess.Invoke(); + if (addR.Success) + { + if (OnSuccess != null) await OnSuccess.Invoke(); + await ModalService.Hide(); + } + else + { + await Notification.Error(addR.Exception?.Message ?? "Unbekannter Fehler beim Hinzufügen.", "Fehler"); + } } - - await ModalService.Hide(); + } + catch (Exception ex) + { + await Notification.Error(ex.Message, "Systemfehler"); } finally { diff --git a/FoodsharingSiegen.Server/Pages/Prospects.razor.cs b/FoodsharingSiegen.Server/Pages/Prospects.razor.cs index 460de62..368add0 100644 --- a/FoodsharingSiegen.Server/Pages/Prospects.razor.cs +++ b/FoodsharingSiegen.Server/Pages/Prospects.razor.cs @@ -100,15 +100,22 @@ namespace FoodsharingSiegen.Server.Pages /// private async Task LoadProspects() { - var parameter = new GetProspectsParameter + try { - CannotHaveInteractions = [InteractionType.Complete, InteractionType.Verify, InteractionType.ReleasedForVerification] - }; + var parameter = new GetProspectsParameter + { + CannotHaveInteractions = [InteractionType.Complete, InteractionType.Verify, InteractionType.ReleasedForVerification] + }; - var prospectsR = await ProspectService.GetProspectsAsync(parameter); - if (prospectsR.Success) ProspectList = prospectsR.Data; + var prospectsR = await ProspectService.GetProspectsAsync(parameter); + if (prospectsR.Success) ProspectList = prospectsR.Data; - await InvokeAsync(StateHasChanged); + await InvokeAsync(StateHasChanged); + } + catch (Exception ex) + { + await Notification.Error(ex.Message, "Fehler beim Laden"); + } } #endregion