diff --git a/src/BootstrapBlazor/Components/ErrorLogger/BootstrapBlazorErrorBoundary.cs b/src/BootstrapBlazor/Components/ErrorLogger/BootstrapBlazorErrorBoundary.cs index ebe855b3435..a36ba9b1568 100644 --- a/src/BootstrapBlazor/Components/ErrorLogger/BootstrapBlazorErrorBoundary.cs +++ b/src/BootstrapBlazor/Components/ErrorLogger/BootstrapBlazorErrorBoundary.cs @@ -5,6 +5,7 @@ using Microsoft.AspNetCore.Components.Rendering; using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using System.Reflection; @@ -31,6 +32,10 @@ class BootstrapBlazorErrorBoundary : ErrorBoundaryBase [NotNull] private NavigationManager? NavigationManager { get; set; } + [Inject] + [NotNull] + private IHostEnvironment? HostEnvironment { get; set; } + /// /// 获得/设置 自定义错误处理回调方法 /// @@ -54,13 +59,10 @@ class BootstrapBlazorErrorBoundary : ErrorBoundaryBase /// /// /// - protected override async Task OnErrorAsync(Exception exception) + protected override Task OnErrorAsync(Exception exception) { - if (ShowToast) - { - await ToastService.Error(ToastTitle, exception.Message); - } Logger.LogError(exception, "{BootstrapBlazorErrorBoundary} {OnErrorAsync} log this error occurred at {Page}", nameof(BootstrapBlazorErrorBoundary), nameof(OnErrorAsync), NavigationManager.Uri); + return Task.CompletedTask; } /// @@ -69,13 +71,13 @@ protected override async Task OnErrorAsync(Exception exception) /// protected override void BuildRenderTree(RenderTreeBuilder builder) { + // 页面生命周期内异常直接调用这里 var ex = CurrentException ?? _exception; if (ex != null) { // 处理自定义异常逻辑 if (OnErrorHandleAsync != null) { - // 页面生命周期内异常直接调用这里 _ = OnErrorHandleAsync(Logger, ex); return; } @@ -132,7 +134,7 @@ private MarkupString GetErrorContentMarkupString(Exception ex) } /// - /// 渲染异常信息方法 + /// BootstrapBlazor 组件导致异常渲染方法 /// /// /// @@ -145,14 +147,35 @@ public async Task RenderException(Exception exception, IHandlerException? handle return; } + // 记录日志 + await OnErrorAsync(exception); + if (handler != null) { - await handler.HandlerException(exception, ExceptionContent); + if (HostEnvironment.IsDevelopment()) + { + // IHandlerException 处理异常逻辑 + await handler.HandlerException(exception, ExceptionContent); + } + else + { + // 非开发模式下弹窗提示错误信息 + await ToastService.Error(ToastTitle, exception.Message); + } return; } - await OnErrorAsync(exception); + // 显示异常信息 + await ShowErrorToast(exception); _exception = exception; StateHasChanged(); } + + private async Task ShowErrorToast(Exception exception) + { + if (ShowToast) + { + await ToastService.Error(ToastTitle, exception.Message); + } + } } diff --git a/src/BootstrapBlazor/Components/Layout/Layout.razor.cs b/src/BootstrapBlazor/Components/Layout/Layout.razor.cs index 2b89bf792e3..8b05464116d 100644 --- a/src/BootstrapBlazor/Components/Layout/Layout.razor.cs +++ b/src/BootstrapBlazor/Components/Layout/Layout.razor.cs @@ -673,7 +673,7 @@ private Task OnErrorLoggerInitialized(ErrorLogger logger) private RenderFragment? _errorContent; /// - /// HandlerException 错误处理方法 + /// /// /// /// diff --git a/src/BootstrapBlazor/Components/Modal/ModalDialog.razor.cs b/src/BootstrapBlazor/Components/Modal/ModalDialog.razor.cs index 2839abf2664..10df7c094b8 100644 --- a/src/BootstrapBlazor/Components/Modal/ModalDialog.razor.cs +++ b/src/BootstrapBlazor/Components/Modal/ModalDialog.razor.cs @@ -449,7 +449,7 @@ private RenderFragment RenderBodyTemplate() => builder => protected RenderFragment? _errorContent; /// - /// HandlerException 错误处理方法 + /// /// /// /// diff --git a/src/BootstrapBlazor/Components/Tab/TabItemContent.cs b/src/BootstrapBlazor/Components/Tab/TabItemContent.cs index 2a1b7c5d18e..04cb2ad5026 100644 --- a/src/BootstrapBlazor/Components/Tab/TabItemContent.cs +++ b/src/BootstrapBlazor/Components/Tab/TabItemContent.cs @@ -93,7 +93,7 @@ public void Render() } /// - /// HandlerException 错误处理方法 + /// /// /// /// diff --git a/src/BootstrapBlazor/Directory.Build.props b/src/BootstrapBlazor/Directory.Build.props index dae29883f9d..46f7181c437 100644 --- a/src/BootstrapBlazor/Directory.Build.props +++ b/src/BootstrapBlazor/Directory.Build.props @@ -34,6 +34,7 @@ + @@ -44,6 +45,7 @@ + @@ -53,6 +55,7 @@ + @@ -62,6 +65,7 @@ + diff --git a/test/UnitTest/Components/BootstrapBlazorRootTest.cs b/test/UnitTest/Components/BootstrapBlazorRootTest.cs index 53c330ee577..52235ca7b28 100644 --- a/test/UnitTest/Components/BootstrapBlazorRootTest.cs +++ b/test/UnitTest/Components/BootstrapBlazorRootTest.cs @@ -5,6 +5,8 @@ //using HarmonyLib; +using Bunit.TestDoubles; + namespace UnitTest.Components; public class BootstrapBlazorRootTest : TestBase @@ -12,17 +14,10 @@ public class BootstrapBlazorRootTest : TestBase [Fact] public void Render_Ok() { - var context = new TestContext(); - context.JSInterop.Mode = JSRuntimeMode.Loose; - - var sc = context.Services; - sc.AddBootstrapBlazor(); - sc.ConfigureJsonLocalizationOptions(op => - { - op.IgnoreLocalizerMissing = false; - }); - sc.AddScoped(); - var cut = context.RenderComponent(); + Context.Services.AddBootstrapBlazor(); + Context.Services.AddScoped(); + Context.Services.GetRequiredService(); + var cut = Context.RenderComponent(); cut.Contains("
"); } diff --git a/test/UnitTest/Components/ErrorLoggerTest.cs b/test/UnitTest/Components/ErrorLoggerTest.cs index 14e744cf933..039dfbc15be 100644 --- a/test/UnitTest/Components/ErrorLoggerTest.cs +++ b/test/UnitTest/Components/ErrorLoggerTest.cs @@ -5,6 +5,8 @@ using Microsoft.AspNetCore.Components.Web; using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.FileProviders; +using Microsoft.Extensions.Hosting; namespace UnitTest.Components; @@ -161,7 +163,7 @@ public void ErrorContent_Ok() var cut = Context.RenderComponent(pb => { pb.Add(a => a.EnableErrorLogger, true); - pb.Add(a => a.ShowToast, false); + pb.Add(a => a.ShowToast, true); pb.AddChildContent