Skip to content

Commit 0643cd4

Browse files
authored
Merge branch 'main' into main
2 parents 8ae8825 + b80e875 commit 0643cd4

File tree

11 files changed

+211
-43
lines changed

11 files changed

+211
-43
lines changed

src/BootstrapBlazor/Components/BaseComponents/BootstrapBlazorRoot.razor

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
@namespace BootstrapBlazor.Components
33

44
<CascadingValue Value="this" IsFixed="true">
5-
<ErrorLogger EnableErrorLogger="EnableErrorLoggerValue" ShowToast="ShowToast" ToastTitle="@ToastTitle" OnErrorHandleAsync="OnErrorHandleAsync!">
5+
<ErrorLogger EnableErrorLogger="_enableErrorLoggerValue" ShowToast="_showToast" ToastTitle="@ToastTitle"
6+
OnErrorHandleAsync="OnErrorHandleAsync">
67
@ChildContent
78

89
<Dialog></Dialog>

src/BootstrapBlazor/Components/BaseComponents/BootstrapBlazorRoot.razor.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,10 @@ public partial class BootstrapBlazorRoot
4848
public Func<ILogger, Exception, Task>? OnErrorHandleAsync { get; set; }
4949

5050
/// <summary>
51-
/// 获得/设置 是否显示 Error 提示弹窗 默认 true 显示
51+
/// 获得/设置 是否显示 Error 提示弹窗 默认 null 使用 <see cref="BootstrapBlazorOptions.ShowErrorLoggerToast"/> 设置值
5252
/// </summary>
5353
[Parameter]
54-
public bool ShowToast { get; set; } = true;
54+
public bool? ShowToast { get; set; }
5555

5656
/// <summary>
5757
/// 获得/设置 Error Toast 弹窗标题
@@ -65,7 +65,9 @@ public partial class BootstrapBlazorRoot
6565
[Parameter]
6666
public bool? EnableErrorLogger { get; set; }
6767

68-
private bool EnableErrorLoggerValue => EnableErrorLogger ?? Options.CurrentValue.EnableErrorLogger;
68+
private bool _enableErrorLoggerValue => EnableErrorLogger ?? Options.CurrentValue.EnableErrorLogger;
69+
70+
private bool _showToast => ShowToast ?? Options.CurrentValue.ShowErrorLoggerToast;
6971

7072
/// <summary>
7173
/// SetParametersAsync 方法

src/BootstrapBlazor/Components/ErrorLogger/BootstrapBlazorErrorBoundary.cs

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -68,19 +68,27 @@ protected override async Task OnErrorAsync(Exception exception)
6868
/// <param name="builder"></param>
6969
protected override void BuildRenderTree(RenderTreeBuilder builder)
7070
{
71-
#if DEBUG
72-
// DEBUG 模式下显示异常堆栈信息到 UI 页面方便开发人员调试
73-
if (OnErrorHandleAsync == null)
71+
var ex = CurrentException ?? _exception;
72+
if (ex != null)
7473
{
75-
var ex = CurrentException ?? _exception;
76-
if (ex != null)
74+
_exception = null;
75+
76+
// 处理自定义异常逻辑
77+
if(OnErrorHandleAsync != null)
7778
{
78-
_exception = null;
79-
builder.AddContent(0, ExceptionContent(ex));
79+
// 页面生命周期内异常直接调用这里
80+
_ = OnErrorHandleAsync(Logger, ex);
81+
return;
8082
}
83+
84+
// 渲染异常内容
85+
builder.AddContent(0, ExceptionContent(ex));
86+
}
87+
else
88+
{
89+
// 渲染正常内容
90+
builder.AddContent(1, ChildContent);
8191
}
82-
#endif
83-
builder.AddContent(1, ChildContent);
8492
}
8593

8694
private Exception? _exception = null;

src/BootstrapBlazor/Components/ErrorLogger/ErrorLogger.cs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,12 @@ public class ErrorLogger : ComponentBase, IErrorLogger
5656
[Parameter]
5757
public RenderFragment<Exception>? ErrorContent { get; set; }
5858

59+
/// <summary>
60+
/// Gets or sets the callback function to be invoked during initialization.
61+
/// </summary>
62+
[Parameter]
63+
public Func<ErrorLogger, Task>? OnInitializedCallback { get; set; }
64+
5965
[NotNull]
6066
private BootstrapBlazorErrorBoundary? _errorBoundary = default;
6167

@@ -69,6 +75,20 @@ protected override void OnInitialized()
6975
ToastTitle ??= Localizer[nameof(ToastTitle)];
7076
}
7177

78+
/// <summary>
79+
/// <inheritdoc/>
80+
/// </summary>
81+
/// <returns></returns>
82+
protected override async Task OnInitializedAsync()
83+
{
84+
await base.OnInitializedAsync();
85+
86+
if (OnInitializedCallback is not null)
87+
{
88+
await OnInitializedCallback(this);
89+
}
90+
}
91+
7292
/// <summary>
7393
/// <inheritdoc/>
7494
/// </summary>
@@ -97,7 +117,7 @@ protected override void BuildRenderTree(RenderTreeBuilder builder)
97117
};
98118

99119
/// <summary>
100-
/// 由接口调用
120+
/// 由实现 <see cref="BootstrapComponentBase"/> 组件实现类调用
101121
/// </summary>
102122
/// <param name="exception"></param>
103123
/// <returns></returns>

src/BootstrapBlazor/Components/Filters/FilterContext.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
// See the LICENSE file in the project root for more information.
44
// Maintainer: Argo Zhang([email protected]) Website: https://www.blazor.zone
55

6-
using System.Runtime.CompilerServices;
7-
86
namespace BootstrapBlazor.Components;
97

108
/// <summary>

src/BootstrapBlazor/Components/Layout/Layout.razor

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,10 @@
126126
}
127127
else
128128
{
129-
@HandlerMain()
129+
<ErrorLogger EnableErrorLogger="@_enableErrorLoggerValue" ShowToast="@_showToast" ToastTitle="@ErrorLoggerToastTitle"
130+
OnErrorHandleAsync="OnErrorHandleAsync" OnInitializedCallback="OnErrorLoggerInitialized">
131+
@HandlerMain()
132+
</ErrorLogger>
130133
}
131134
</main>;
132135

src/BootstrapBlazor/Components/Layout/Layout.razor.cs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Microsoft.AspNetCore.Components.Authorization;
77
using Microsoft.AspNetCore.Components.Routing;
88
using Microsoft.Extensions.Localization;
9+
using Microsoft.Extensions.Logging;
910
using System.Reflection;
1011

1112
namespace BootstrapBlazor.Components;
@@ -452,12 +453,40 @@ public partial class Layout : IHandlerException, ITabHeader
452453
[Parameter]
453454
public object? Resource { get; set; }
454455

456+
/// <summary>
457+
/// 获得/设置 是否开启全局异常捕获 默认 null 读取配置文件 EnableErrorLogger 值
458+
/// </summary>
459+
[Parameter]
460+
public bool? EnableErrorLogger { get; set; }
461+
462+
/// <summary>
463+
/// 获得/设置 是否显示 Error 提示弹窗 默认 null 使用 <see cref="BootstrapBlazorOptions.ShowErrorLoggerToast"/> 设置值
464+
/// </summary>
465+
[Parameter]
466+
public bool? ShowErrorLoggerToast { get; set; }
467+
468+
/// <summary>
469+
/// 获得/设置 错误日志 <see cref="Toast"/> 弹窗标题 默认 null
470+
/// </summary>
471+
[Parameter]
472+
public string? ErrorLoggerToastTitle { get; set; }
473+
474+
/// <summary>
475+
/// 获得/设置 自定义错误处理回调方法
476+
/// </summary>
477+
[Parameter]
478+
public Func<ILogger, Exception, Task>? OnErrorHandleAsync { get; set; }
479+
455480
/// <summary>
456481
/// 获得 登录授权信息
457482
/// </summary>
458483
[CascadingParameter]
459484
private Task<AuthenticationState>? AuthenticationStateTask { get; set; }
460485

486+
[Inject]
487+
[NotNull]
488+
private IOptionsMonitor<BootstrapBlazorOptions>? Options { get; set; }
489+
461490
[Inject, NotNull]
462491
private IServiceProvider? ServiceProvider { get; set; }
463492

@@ -470,6 +499,10 @@ public partial class Layout : IHandlerException, ITabHeader
470499

471500
private ITabHeader? TabHeader => ShowTabInHeader ? this : null;
472501

502+
private bool _enableErrorLoggerValue => EnableErrorLogger ?? Options.CurrentValue.EnableErrorLogger;
503+
504+
private bool _showToast => ShowErrorLoggerToast ?? Options.CurrentValue.ShowErrorLoggerToast;
505+
473506
/// <summary>
474507
/// <inheritdoc/>
475508
/// </summary>
@@ -625,6 +658,15 @@ private async Task ToggleSidebar()
625658
await TriggerCollapseChanged();
626659
}
627660

661+
private ErrorLogger? _errorLogger;
662+
663+
private Task OnErrorLoggerInitialized(ErrorLogger logger)
664+
{
665+
_errorLogger = logger;
666+
_errorLogger.Register(this);
667+
return Task.CompletedTask;
668+
}
669+
628670
/// <summary>
629671
/// 上次渲染错误内容
630672
/// </summary>
@@ -678,6 +720,7 @@ protected override async ValueTask DisposeAsync(bool disposing)
678720

679721
if (disposing)
680722
{
723+
_errorLogger?.UnRegister(this);
681724
ErrorLogger?.UnRegister(this);
682725
if (SubscribedLocationChangedEvent)
683726
{

src/BootstrapBlazor/Options/BootstrapBlazorOptions.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ public class BootstrapBlazorOptions : IOptions<BootstrapBlazorOptions>
4848
/// </summary>
4949
public bool EnableErrorLogger { get; set; } = true;
5050

51+
/// <summary>
52+
/// Gets or sets whether to enable show toast popup when global exception capture, default is true
53+
/// </summary>
54+
public bool ShowErrorLoggerToast { get; set; } = true;
55+
5156
/// <summary>
5257
/// Gets or sets whether to fall back to the fallback culture, default is true
5358
/// </summary>

test/UnitTest/Components/ErrorHandlerTest.cs

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -32,31 +32,6 @@ await cut.InvokeAsync(() => dialog.Show(new DialogOption()
3232
await cut.InvokeAsync(() => btn.Click());
3333
}
3434

35-
[Fact]
36-
public async Task ShowToast_Ok()
37-
{
38-
var cut = Context.RenderComponent<BootstrapBlazorRoot>(pb =>
39-
{
40-
pb.AddChildContent<ErrorComponent>();
41-
});
42-
var errorButton = cut.Find(".btn-error");
43-
await cut.InvokeAsync(() => errorButton.Click());
44-
cut.Contains("<div class=\"toast-body\">test error logger</div>");
45-
46-
// 关闭 Toast
47-
var toast = cut.FindComponent<Toast>().Instance;
48-
await cut.InvokeAsync(() => toast.Close());
49-
cut.DoesNotContain("<div class=\"toast-body\">test error logger</div>");
50-
51-
cut.SetParametersAndRender(pb =>
52-
{
53-
pb.Add(a => a.ShowToast, false);
54-
});
55-
errorButton = cut.Find(".btn-error");
56-
await cut.InvokeAsync(() => errorButton.Click());
57-
cut.DoesNotContain("<div class=\"toast-body\">test error logger</div>");
58-
}
59-
6035
private class MockDialogTest : ComponentBase
6136
{
6237
[Inject]

0 commit comments

Comments
 (0)