From 371cda81584389e505219609c2c190d2853fb35f Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Wed, 4 Jun 2025 09:42:15 +0800 Subject: [PATCH 1/6] =?UTF-8?q?refactor:=20=E6=9B=B4=E6=94=B9=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/Layout/Layout.razor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BootstrapBlazor/Components/Layout/Layout.razor b/src/BootstrapBlazor/Components/Layout/Layout.razor index c3593ca37ea..e21e9a40bd1 100644 --- a/src/BootstrapBlazor/Components/Layout/Layout.razor +++ b/src/BootstrapBlazor/Components/Layout/Layout.razor @@ -148,7 +148,7 @@ RefreshToolbarTooltipText="@RefreshToolbarTooltipText" FullscreenToolbarTooltipText="@FullscreenToolbarTooltipText" OnToolbarRefreshCallback="OnToolbarRefreshCallback" TabHeader="TabHeader" Body="@Main" NotAuthorized="NotAuthorized!" NotFound="NotFound!" NotFoundTabText="@NotFoundTabText" - EnableErrorLogger="EnableErrorLogger" ShowErrorLoggerToast="ShowErrorLoggerToast" + EnableErrorLogger="@_enableErrorLogger" ShowErrorLoggerToast="@_showToast" ErrorLoggerToastTitle="@ErrorLoggerToastTitle"> ; From 16552d237566f940b0d240d82c58dd7808a05d96 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Wed, 4 Jun 2025 10:00:06 +0800 Subject: [PATCH 2/6] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=20HandlerExcepti?= =?UTF-8?q?on=20=E5=AE=9E=E7=8E=B0=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Tab/TabItemContent.cs | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/BootstrapBlazor/Components/Tab/TabItemContent.cs b/src/BootstrapBlazor/Components/Tab/TabItemContent.cs index a9e7662be0b..88148ae4a1e 100644 --- a/src/BootstrapBlazor/Components/Tab/TabItemContent.cs +++ b/src/BootstrapBlazor/Components/Tab/TabItemContent.cs @@ -7,7 +7,7 @@ namespace BootstrapBlazor.Components; -class TabItemContent : IComponent +class TabItemContent : IComponent, IHandlerException, IDisposable { /// /// Gets or sets the component content. Default is null @@ -18,6 +18,11 @@ class TabItemContent : IComponent [CascadingParameter, NotNull] private Tab? TabSet { get; set; } + [Inject, NotNull] + private DialogService? DialogService { get; set; } + + private ErrorLogger? _logger; + private RenderHandle _renderHandle; void IComponent.Attach(RenderHandle renderHandle) @@ -60,6 +65,12 @@ private RenderFragment RenderItemContent(RenderFragment? content) => builder => builder.AddAttribute(2, nameof(ErrorLogger.EnableErrorLogger), enableErrorLogger); builder.AddAttribute(3, nameof(ErrorLogger.ShowToast), showToast); builder.AddAttribute(4, nameof(ErrorLogger.ToastTitle), TabSet.ErrorLoggerToastTitle); + builder.AddAttribute(5, nameof(ErrorLogger.OnInitializedCallback), new Func(logger => + { + _logger = logger; + _logger.Register(this); + return Task.CompletedTask; + })); builder.CloseComponent(); }; @@ -75,4 +86,20 @@ public void Render() _key = new object(); RenderContent(); } + + /// + /// HandlerException 错误处理方法 + /// + /// + /// + public Task HandlerException(Exception ex, RenderFragment errorContent) => DialogService.ShowErrorHandlerDialog(errorContent(ex)); + + /// + /// IDispose 方法用于释放资源 + /// + public void Dispose() + { + _logger?.UnRegister(this); + GC.SuppressFinalize(this); + } } From 20cdb230863851cc4491a8786b305db5db51aeaa Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Wed, 4 Jun 2025 10:47:46 +0800 Subject: [PATCH 3/6] =?UTF-8?q?test:=20=E8=A1=A5=E5=85=85=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/UnitTest/Components/ImageTest.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/test/UnitTest/Components/ImageTest.cs b/test/UnitTest/Components/ImageTest.cs index 80405bcb0d0..232ac912633 100644 --- a/test/UnitTest/Components/ImageTest.cs +++ b/test/UnitTest/Components/ImageTest.cs @@ -139,6 +139,7 @@ public void ImagerViewer_Show() { var cut = Context.RenderComponent(pb => { + pb.Add(a => a.ZoomSpeed, 0.5d); pb.Add(a => a.PreviewList, ["v1", "v2"]); }); cut.Instance.Show(); From cbd50a82ee408d1dd0d3aba449532c2e72e298e4 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Wed, 4 Jun 2025 11:24:33 +0800 Subject: [PATCH 4/6] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E5=85=A8?= =?UTF-8?q?=E5=B1=80=E9=85=8D=E7=BD=AE=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/Tab/TabItemContent.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/BootstrapBlazor/Components/Tab/TabItemContent.cs b/src/BootstrapBlazor/Components/Tab/TabItemContent.cs index 88148ae4a1e..cc0af4b8653 100644 --- a/src/BootstrapBlazor/Components/Tab/TabItemContent.cs +++ b/src/BootstrapBlazor/Components/Tab/TabItemContent.cs @@ -21,6 +21,10 @@ class TabItemContent : IComponent, IHandlerException, IDisposable [Inject, NotNull] private DialogService? DialogService { get; set; } + [Inject] + [NotNull] + private IOptionsMonitor? Options { get; set; } + private ErrorLogger? _logger; private RenderHandle _renderHandle; @@ -60,8 +64,8 @@ private RenderFragment RenderItemContent(RenderFragment? content) => builder => builder.OpenComponent(0); builder.AddAttribute(1, nameof(ErrorLogger.ChildContent), content); - var enableErrorLogger = TabSet.EnableErrorLogger; - var showToast = TabSet.ShowErrorLoggerToast; + var enableErrorLogger = TabSet.EnableErrorLogger ?? Options.CurrentValue.EnableErrorLogger; + var showToast = TabSet.ShowErrorLoggerToast ?? Options.CurrentValue.ShowErrorLoggerToast; builder.AddAttribute(2, nameof(ErrorLogger.EnableErrorLogger), enableErrorLogger); builder.AddAttribute(3, nameof(ErrorLogger.ShowToast), showToast); builder.AddAttribute(4, nameof(ErrorLogger.ToastTitle), TabSet.ErrorLoggerToastTitle); From 596a502bcae6f8b108d5716efe5300c1f0699b38 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Wed, 4 Jun 2025 11:24:42 +0800 Subject: [PATCH 5/6] =?UTF-8?q?test:=20=E6=9B=B4=E6=96=B0=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/UnitTest/Components/ImageTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/UnitTest/Components/ImageTest.cs b/test/UnitTest/Components/ImageTest.cs index 232ac912633..34329f1fc13 100644 --- a/test/UnitTest/Components/ImageTest.cs +++ b/test/UnitTest/Components/ImageTest.cs @@ -128,6 +128,7 @@ public void IsIntersectionObserver_Ok() { var cut = Context.RenderComponent(pb => { + pb.Add(a => a.ZoomSpeed, 0.5d); pb.Add(a => a.Url, "https://www.blazor.zone/images/logo.png"); pb.Add(a => a.IsIntersectionObserver, true); }); @@ -139,7 +140,6 @@ public void ImagerViewer_Show() { var cut = Context.RenderComponent(pb => { - pb.Add(a => a.ZoomSpeed, 0.5d); pb.Add(a => a.PreviewList, ["v1", "v2"]); }); cut.Instance.Show(); From 64c0c72ecde3cc9d796812eeaa179ddc6c77c6dc Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Wed, 4 Jun 2025 11:25:00 +0800 Subject: [PATCH 6/6] =?UTF-8?q?test:=20=E5=A2=9E=E5=8A=A0=20TabItemContent?= =?UTF-8?q?=20=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/UnitTest/Components/ErrorLoggerTest.cs | 42 +++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/test/UnitTest/Components/ErrorLoggerTest.cs b/test/UnitTest/Components/ErrorLoggerTest.cs index dffeeec1bb2..14e744cf933 100644 --- a/test/UnitTest/Components/ErrorLoggerTest.cs +++ b/test/UnitTest/Components/ErrorLoggerTest.cs @@ -185,4 +185,46 @@ public void ErrorContent_Ok() cut.InvokeAsync(() => button.Click()); cut.Contains("Attempted to divide by zero.error_content_template"); } + + [Fact] + public async Task TabItem_Error() + { + var cut = Context.RenderComponent(pb => + { + pb.AddChildContent(pb => + { + pb.AddChildContent(pb => + { + pb.Add(a => a.Text, "Text1"); + pb.Add(a => a.ChildContent, builder => builder.AddContent(0, RenderButton())); + }); + }); + }); + + var button = cut.Find("button"); + await cut.InvokeAsync(() => button.Click()); + + // 页面不崩溃,由弹窗显示异常信息 + cut.Contains("
TimeStamp:"); + + // 单元测试覆盖 TabItemContent Dispose 方法 + var handler = Activator.CreateInstance("BootstrapBlazor", "BootstrapBlazor.Components.TabItemContent"); + Assert.NotNull(handler); + var content = handler.Unwrap(); + Assert.NotNull(content); + + Assert.IsType(content, exactMatch: false); + ((IDisposable)content).Dispose(); + } + + private RenderFragment RenderButton() => builder => + { + builder.OpenComponent