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