From 77eecf224382ba41d2252bc0affa1f4dfa22d435 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 1 Jun 2025 14:26:40 +0800 Subject: [PATCH 01/14] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/BaseComponents/IdComponentBase.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/BootstrapBlazor/Components/BaseComponents/IdComponentBase.cs b/src/BootstrapBlazor/Components/BaseComponents/IdComponentBase.cs index c94406b9588..17f0c93fa16 100644 --- a/src/BootstrapBlazor/Components/BaseComponents/IdComponentBase.cs +++ b/src/BootstrapBlazor/Components/BaseComponents/IdComponentBase.cs @@ -32,9 +32,9 @@ public abstract class IdComponentBase : BootstrapComponentBase /// /// /// - protected override void OnParametersSet() + protected override void OnInitialized() { - base.OnParametersSet(); + base.OnInitialized(); Id ??= ComponentIdGenerator.Generate(this); } From af169d6c84a641ab90703bbd5fc99c7b6b10d427 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 1 Jun 2025 19:33:26 +0800 Subject: [PATCH 02/14] =?UTF-8?q?refactor:=20=E6=9B=B4=E6=94=B9=20IErrorLo?= =?UTF-8?q?gger=20=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/ErrorLogger/ErrorLogger.cs | 16 ++++++++++++---- .../Components/ErrorLogger/IErrorLogger.cs | 8 ++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/BootstrapBlazor/Components/ErrorLogger/ErrorLogger.cs b/src/BootstrapBlazor/Components/ErrorLogger/ErrorLogger.cs index b6b195dd3fe..d299ef66cb2 100644 --- a/src/BootstrapBlazor/Components/ErrorLogger/ErrorLogger.cs +++ b/src/BootstrapBlazor/Components/ErrorLogger/ErrorLogger.cs @@ -22,13 +22,13 @@ public class ErrorLogger : ComponentBase, IErrorLogger /// /// [Parameter] - public bool EnableErrorLogger { get; set; } = true; + public bool? EnableErrorLogger { get; set; } /// /// /// [Parameter] - public bool ShowToast { get; set; } = true; + public bool? ShowToast { get; set; } /// /// @@ -62,9 +62,17 @@ public class ErrorLogger : ComponentBase, IErrorLogger [Parameter] public Func? OnInitializedCallback { get; set; } + [Inject] + [NotNull] + private IOptionsMonitor? Options { get; set; } + [NotNull] private BootstrapBlazorErrorBoundary? _errorBoundary = default; + private bool _enableErrorLogger => EnableErrorLogger ?? Options.CurrentValue.EnableErrorLogger; + + private bool _showToast => ShowToast ?? Options.CurrentValue.ShowErrorLoggerToast; + /// /// /// @@ -102,13 +110,13 @@ protected override void BuildRenderTree(RenderTreeBuilder builder) builder.CloseComponent(); } - private RenderFragment? RenderContent => EnableErrorLogger ? RenderError : ChildContent; + private RenderFragment? RenderContent => _enableErrorLogger ? RenderError : ChildContent; private RenderFragment RenderError => builder => { builder.OpenComponent(0); builder.AddAttribute(1, nameof(BootstrapBlazorErrorBoundary.OnErrorHandleAsync), OnErrorHandleAsync); - builder.AddAttribute(2, nameof(BootstrapBlazorErrorBoundary.ShowToast), ShowToast); + builder.AddAttribute(2, nameof(BootstrapBlazorErrorBoundary.ShowToast), _showToast); builder.AddAttribute(3, nameof(BootstrapBlazorErrorBoundary.ToastTitle), ToastTitle); builder.AddAttribute(4, nameof(BootstrapBlazorErrorBoundary.ErrorContent), ErrorContent); builder.AddAttribute(5, nameof(BootstrapBlazorErrorBoundary.ChildContent), ChildContent); diff --git a/src/BootstrapBlazor/Components/ErrorLogger/IErrorLogger.cs b/src/BootstrapBlazor/Components/ErrorLogger/IErrorLogger.cs index 5d30ae21cb3..2d449b05501 100644 --- a/src/BootstrapBlazor/Components/ErrorLogger/IErrorLogger.cs +++ b/src/BootstrapBlazor/Components/ErrorLogger/IErrorLogger.cs @@ -11,9 +11,9 @@ namespace BootstrapBlazor.Components; public interface IErrorLogger { /// - /// 获得/设置 是否开启全局异常捕获 默认 true + /// 获得/设置 是否开启全局异常捕获 默认 null 使用全局配置 值 /// - bool EnableErrorLogger { get; set; } + bool? EnableErrorLogger { get; set; } /// /// 获得/设置 自定义 Error 处理方法 默认 null @@ -23,9 +23,9 @@ public interface IErrorLogger Task HandlerExceptionAsync(Exception ex); /// - /// 获得 是否显示 Error 提示弹窗 默认 true 显示 + /// 获得 是否显示 Error 提示弹窗 默认 null 使用全局配置 值 /// - bool ShowToast { get; } + bool? ShowToast { get; } /// /// 获得 Error Toast 弹窗标题 默认读取资源文件内容 From aef2af4be7c49c015b140d6986b779d3c444f3f4 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 1 Jun 2025 19:35:32 +0800 Subject: [PATCH 03/14] =?UTF-8?q?refactor:=20=E6=94=B9=E9=80=A0=20Layout?= =?UTF-8?q?=20=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/Layout/Layout.razor | 2 +- src/BootstrapBlazor/Components/Layout/Layout.razor.cs | 8 -------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/src/BootstrapBlazor/Components/Layout/Layout.razor b/src/BootstrapBlazor/Components/Layout/Layout.razor index a7e689ea1cf..2b1826f1725 100644 --- a/src/BootstrapBlazor/Components/Layout/Layout.razor +++ b/src/BootstrapBlazor/Components/Layout/Layout.razor @@ -126,7 +126,7 @@ } else { - @HandlerMain() diff --git a/src/BootstrapBlazor/Components/Layout/Layout.razor.cs b/src/BootstrapBlazor/Components/Layout/Layout.razor.cs index 191a13a232f..fb28b9cd819 100644 --- a/src/BootstrapBlazor/Components/Layout/Layout.razor.cs +++ b/src/BootstrapBlazor/Components/Layout/Layout.razor.cs @@ -483,10 +483,6 @@ public partial class Layout : IHandlerException, ITabHeader [CascadingParameter] private Task? AuthenticationStateTask { get; set; } - [Inject] - [NotNull] - private IOptionsMonitor? Options { get; set; } - [Inject, NotNull] private IServiceProvider? ServiceProvider { get; set; } @@ -499,10 +495,6 @@ public partial class Layout : IHandlerException, ITabHeader private ITabHeader? TabHeader => ShowTabInHeader ? this : null; - private bool _enableErrorLoggerValue => EnableErrorLogger ?? Options.CurrentValue.EnableErrorLogger; - - private bool _showToast => ShowErrorLoggerToast ?? Options.CurrentValue.ShowErrorLoggerToast; - /// /// /// From dd7bfa2aff6220bb7bf7df3f27c7cf27f13d30ad Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 1 Jun 2025 19:36:51 +0800 Subject: [PATCH 04/14] =?UTF-8?q?refactor:=20=E5=A2=9E=E5=BC=BA=20TabItemC?= =?UTF-8?q?ontent=20=E6=94=AF=E6=8C=81=E7=94=9F=E5=91=BD=E5=91=A8=E6=9C=9F?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E6=8D=95=E8=8E=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Tab/TabItemContent.cs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/BootstrapBlazor/Components/Tab/TabItemContent.cs b/src/BootstrapBlazor/Components/Tab/TabItemContent.cs index 37fac44e95d..a9f1a9e9d47 100644 --- a/src/BootstrapBlazor/Components/Tab/TabItemContent.cs +++ b/src/BootstrapBlazor/Components/Tab/TabItemContent.cs @@ -15,6 +15,9 @@ internal class TabItemContent : IComponent [Parameter, NotNull] public TabItem? Item { get; set; } + [CascadingParameter] + private Layout? Layout { get; set; } + private RenderHandle _renderHandle; void IComponent.Attach(RenderHandle renderHandle) @@ -43,10 +46,22 @@ private void BuildRenderTree(RenderTreeBuilder builder) builder.SetKey(_key); builder.AddAttribute(5, "class", ClassString); builder.AddAttribute(6, "id", Item.Id); - builder.AddContent(10, Item.ChildContent); + builder.AddContent(10, RenderItemContent(Item.ChildContent)); builder.CloseElement(); } + private RenderFragment RenderItemContent(RenderFragment? content) => builder => + { + builder.OpenComponent(0); + builder.AddAttribute(1, nameof(ErrorLogger.ChildContent), content); + + var enableErrorLogger = Layout?.EnableErrorLogger; + var showToast = Layout?.ShowErrorLoggerToast; + builder.AddAttribute(2, nameof(ErrorLogger.EnableErrorLogger), enableErrorLogger); + builder.AddAttribute(3, nameof(ErrorLogger.ShowToast), showToast); + builder.CloseComponent(); + }; + private string? ClassString => CssBuilder.Default("tabs-body-content") .AddClass("d-none", !Item.IsActive) .Build(); From 877a59cc2572808a75f9bcd9be3dc2f1d3cb8169 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 1 Jun 2025 19:37:09 +0800 Subject: [PATCH 05/14] chore: bump version 9.7.1-beta03 --- src/BootstrapBlazor/BootstrapBlazor.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BootstrapBlazor/BootstrapBlazor.csproj b/src/BootstrapBlazor/BootstrapBlazor.csproj index 9c0901e81b8..3496eb35f13 100644 --- a/src/BootstrapBlazor/BootstrapBlazor.csproj +++ b/src/BootstrapBlazor/BootstrapBlazor.csproj @@ -1,7 +1,7 @@  - 9.7.1-beta02 + 9.7.1-beta03 From d8413416040e1b53c9b93435f72e02dbbf584ca7 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Mon, 2 Jun 2025 15:35:07 +0800 Subject: [PATCH 06/14] =?UTF-8?q?wip:=20=E4=B8=B4=E6=97=B6=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/Tab/Tab.razor | 6 +- .../Components/Tab/Tab.razor.cs | 42 +---------- .../Components/Tab/TabHeader.cs | 70 +++++++++++++++++++ 3 files changed, 72 insertions(+), 46 deletions(-) create mode 100644 src/BootstrapBlazor/Components/Tab/TabHeader.cs diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor b/src/BootstrapBlazor/Components/Tab/Tab.razor index b7b4796c7c7..d1f8227c4e1 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor @@ -170,11 +170,7 @@ else RenderFragment RenderHeaderItem(TabItem item) => @
- - @RenderHeaderItemContent(item) - + @RenderHeaderLinkItem(item) @if (TabStyle == TabStyle.Chrome) { diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs index 49fd1d762e8..fcab55d884e 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs @@ -534,19 +534,7 @@ protected override void OnParametersSet() TabStyle = TabStyle.Default; } - if (ClickTabToNavigation) - { - if (!HandlerNavigation) - { - HandlerNavigation = true; - Navigator.LocationChanged += Navigator_LocationChanged; - } - AddTabByUrl(); - } - else - { - RemoveLocationChanged(); - } + AddTabByUrl(); } /// @@ -581,22 +569,6 @@ protected override async Task OnAfterRenderAsync(bool firstRender) /// protected override Task InvokeInitAsync() => InvokeVoidAsync("init", Id, Interop, nameof(DragItemCallback)); - private void RemoveLocationChanged() - { - if (HandlerNavigation) - { - Navigator.LocationChanged -= Navigator_LocationChanged; - HandlerNavigation = false; - } - } - - private void Navigator_LocationChanged(object? sender, Microsoft.AspNetCore.Components.Routing.LocationChangedEventArgs e) - { - AddTabByUrl(); - InvokeUpdate = true; - StateHasChanged(); - } - private void AddTabByUrl() { var requestUrl = Navigator.ToBaseRelativePath(Navigator.Uri); @@ -623,23 +595,12 @@ private void AddTabByUrl() private bool ShouldShowExtendButtons() => ShowExtendButtons && (Placement == Placement.Top || Placement == Placement.Bottom); - /// - /// 点击 TabItem 时回调此方法 - /// private async Task OnClickTabItem(TabItem item) { if (OnClickTabItemAsync != null) { await OnClickTabItemAsync(item); } - - if (!ClickTabToNavigation) - { - TabItems.ForEach(i => i.SetActive(false)); - item.SetActive(true); - InvokeUpdate = true; - StateHasChanged(); - } } /// @@ -1227,7 +1188,6 @@ protected override async ValueTask DisposeAsync(bool disposing) if (disposing) { - RemoveLocationChanged(); ErrorLogger?.UnRegister(this); } } diff --git a/src/BootstrapBlazor/Components/Tab/TabHeader.cs b/src/BootstrapBlazor/Components/Tab/TabHeader.cs new file mode 100644 index 00000000000..af5d6f8868f --- /dev/null +++ b/src/BootstrapBlazor/Components/Tab/TabHeader.cs @@ -0,0 +1,70 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the Apache 2.0 License +// See the LICENSE file in the project root for more information. +// Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone + +using Microsoft.AspNetCore.Components.Rendering; +using Microsoft.AspNetCore.Components.Web; + +namespace BootstrapBlazor.Components; + +class TabHeader : IComponent +{ + [Parameter] + public string? Url { get; set; } + + [Parameter] + public string? Class { get; set; } + + [Parameter] + public Func? OnClick { get; set; } + + [Parameter] + public RenderFragment? ChildContent { get; set; } + + private RenderHandle _renderHandle; + + void IComponent.Attach(RenderHandle renderHandle) + { + _renderHandle = renderHandle; + } + + /// + /// + /// + /// + /// + Task IComponent.SetParametersAsync(ParameterView parameters) + { + parameters.SetParameterProperties(this); + + RenderContent(); + return Task.CompletedTask; + } + private void RenderContent() + { + _renderHandle.Render(BuildRenderTree); + } + + /// + /// + /// + /// + private void BuildRenderTree(RenderTreeBuilder builder) + { + builder.OpenElement(0, "a"); + builder.AddAttribute(10, "class", Class); + builder.AddAttribute(20, "href", Url); + builder.AddAttribute(30, "onclick", EventCallback.Factory.Create(this, e => OnClickCallback())); + builder.AddContent(40, ChildContent); + builder.CloseElement(); + } + + private async Task OnClickCallback() + { + if (OnClick != null) + { + await OnClick(); + } + } +} From fce43e8a16f488ec82e53e63600098c0edf9fbe1 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Mon, 2 Jun 2025 17:06:35 +0800 Subject: [PATCH 07/14] =?UTF-8?q?Revert=20"wip:=20=E4=B8=B4=E6=97=B6?= =?UTF-8?q?=E6=8F=90=E4=BA=A4"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit d8413416040e1b53c9b93435f72e02dbbf584ca7. --- src/BootstrapBlazor/Components/Tab/Tab.razor | 12 ++-- .../Components/Tab/Tab.razor.cs | 42 ++++++++++- .../Components/Tab/TabHeader.cs | 70 ------------------- 3 files changed, 49 insertions(+), 75 deletions(-) delete mode 100644 src/BootstrapBlazor/Components/Tab/TabHeader.cs diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor b/src/BootstrapBlazor/Components/Tab/Tab.razor index d1f8227c4e1..6f31d9727ee 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor @@ -149,15 +149,15 @@ else @ContextMenuTemplate(this) } ; - + RenderFragment RenderTabItem => item => @ @RenderTabItemContent(item) ; - RenderFragment RenderDisabledHeaderItem(TabItem item) => + RenderFragment RenderDisabledHeaderItem(TabItem item) => @
- @@ -170,7 +170,11 @@ else RenderFragment RenderHeaderItem(TabItem item) => @
- @RenderHeaderLinkItem(item) + + @RenderHeaderItemContent(item) + @if (TabStyle == TabStyle.Chrome) { diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs index fcab55d884e..49fd1d762e8 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs @@ -534,7 +534,19 @@ protected override void OnParametersSet() TabStyle = TabStyle.Default; } - AddTabByUrl(); + if (ClickTabToNavigation) + { + if (!HandlerNavigation) + { + HandlerNavigation = true; + Navigator.LocationChanged += Navigator_LocationChanged; + } + AddTabByUrl(); + } + else + { + RemoveLocationChanged(); + } } /// @@ -569,6 +581,22 @@ protected override async Task OnAfterRenderAsync(bool firstRender) /// protected override Task InvokeInitAsync() => InvokeVoidAsync("init", Id, Interop, nameof(DragItemCallback)); + private void RemoveLocationChanged() + { + if (HandlerNavigation) + { + Navigator.LocationChanged -= Navigator_LocationChanged; + HandlerNavigation = false; + } + } + + private void Navigator_LocationChanged(object? sender, Microsoft.AspNetCore.Components.Routing.LocationChangedEventArgs e) + { + AddTabByUrl(); + InvokeUpdate = true; + StateHasChanged(); + } + private void AddTabByUrl() { var requestUrl = Navigator.ToBaseRelativePath(Navigator.Uri); @@ -595,12 +623,23 @@ private void AddTabByUrl() private bool ShouldShowExtendButtons() => ShowExtendButtons && (Placement == Placement.Top || Placement == Placement.Bottom); + /// + /// 点击 TabItem 时回调此方法 + /// private async Task OnClickTabItem(TabItem item) { if (OnClickTabItemAsync != null) { await OnClickTabItemAsync(item); } + + if (!ClickTabToNavigation) + { + TabItems.ForEach(i => i.SetActive(false)); + item.SetActive(true); + InvokeUpdate = true; + StateHasChanged(); + } } /// @@ -1188,6 +1227,7 @@ protected override async ValueTask DisposeAsync(bool disposing) if (disposing) { + RemoveLocationChanged(); ErrorLogger?.UnRegister(this); } } diff --git a/src/BootstrapBlazor/Components/Tab/TabHeader.cs b/src/BootstrapBlazor/Components/Tab/TabHeader.cs deleted file mode 100644 index af5d6f8868f..00000000000 --- a/src/BootstrapBlazor/Components/Tab/TabHeader.cs +++ /dev/null @@ -1,70 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the Apache 2.0 License -// See the LICENSE file in the project root for more information. -// Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone - -using Microsoft.AspNetCore.Components.Rendering; -using Microsoft.AspNetCore.Components.Web; - -namespace BootstrapBlazor.Components; - -class TabHeader : IComponent -{ - [Parameter] - public string? Url { get; set; } - - [Parameter] - public string? Class { get; set; } - - [Parameter] - public Func? OnClick { get; set; } - - [Parameter] - public RenderFragment? ChildContent { get; set; } - - private RenderHandle _renderHandle; - - void IComponent.Attach(RenderHandle renderHandle) - { - _renderHandle = renderHandle; - } - - /// - /// - /// - /// - /// - Task IComponent.SetParametersAsync(ParameterView parameters) - { - parameters.SetParameterProperties(this); - - RenderContent(); - return Task.CompletedTask; - } - private void RenderContent() - { - _renderHandle.Render(BuildRenderTree); - } - - /// - /// - /// - /// - private void BuildRenderTree(RenderTreeBuilder builder) - { - builder.OpenElement(0, "a"); - builder.AddAttribute(10, "class", Class); - builder.AddAttribute(20, "href", Url); - builder.AddAttribute(30, "onclick", EventCallback.Factory.Create(this, e => OnClickCallback())); - builder.AddContent(40, ChildContent); - builder.CloseElement(); - } - - private async Task OnClickCallback() - { - if (OnClick != null) - { - await OnClick(); - } - } -} From 22caa1ed1932596ef52134eaaa1b29e8dca8d271 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 3 Jun 2025 13:53:50 +0800 Subject: [PATCH 08/14] =?UTF-8?q?refactor:=20=E6=92=A4=E9=94=80=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/Tab/Tab.razor | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor b/src/BootstrapBlazor/Components/Tab/Tab.razor index 6f31d9727ee..128f621c301 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor @@ -170,11 +170,11 @@ else RenderFragment RenderHeaderItem(TabItem item) => @
- - @RenderHeaderItemContent(item) - + + @RenderHeaderItemContent(item) + @if (TabStyle == TabStyle.Chrome) { From 80ec5a8b68f3c40d9a1685c311ea3e388cd09407 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 3 Jun 2025 13:54:26 +0800 Subject: [PATCH 09/14] =?UTF-8?q?refactor:=20=E4=BB=A3=E7=A0=81=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/Tab/Tab.razor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor b/src/BootstrapBlazor/Components/Tab/Tab.razor index 128f621c301..7770f616e42 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor @@ -173,7 +173,7 @@ else - @RenderHeaderItemContent(item) + @RenderHeaderItemContent(item) @if (TabStyle == TabStyle.Chrome) { From 4faa3fbca13deaeb4c52b461bffb5dcd8260a949 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 3 Jun 2025 13:59:07 +0800 Subject: [PATCH 10/14] =?UTF-8?q?test:=20=E6=92=A4=E9=94=80=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95=E6=9B=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/UnitTest/Components/LayoutTest.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/test/UnitTest/Components/LayoutTest.cs b/test/UnitTest/Components/LayoutTest.cs index 2224df22b62..fa8c89418d0 100644 --- a/test/UnitTest/Components/LayoutTest.cs +++ b/test/UnitTest/Components/LayoutTest.cs @@ -535,7 +535,6 @@ public void IHandlerException_Ok() pb.Add(a => a.EnableErrorLogger, true); pb.AddChildContent(pb => { - pb.Add(a => a.EnableErrorLogger, true); // 按钮触发异常 pb.Add(a => a.Main, new RenderFragment(builder => { From fbdc903be98c70027b995e3678a8a68b06b9e68e Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 3 Jun 2025 14:02:33 +0800 Subject: [PATCH 11/14] =?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/ErrorLoggerTest.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/UnitTest/Components/ErrorLoggerTest.cs b/test/UnitTest/Components/ErrorLoggerTest.cs index ae3587bbd08..dffeeec1bb2 100644 --- a/test/UnitTest/Components/ErrorLoggerTest.cs +++ b/test/UnitTest/Components/ErrorLoggerTest.cs @@ -122,7 +122,9 @@ public void OnErrorHandleAsync_Tab() cut.Contains("errorLogger-click"); var button = cut.Find("button"); button.TriggerEvent("onclick", EventArgs.Empty); - cut.Contains("
TimeStamp:"); + + // TabItem 内显示异常信息 + cut.Contains("error-stack"); } [Fact] From a9b4fd0e09044958a1a729556163acaead407ba6 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 3 Jun 2025 14:24:16 +0800 Subject: [PATCH 12/14] =?UTF-8?q?refactor:=20=E6=9B=B4=E6=96=B0=20ErrorLog?= =?UTF-8?q?ger=20=E6=98=AF=E5=90=A6=E5=BC=80=E5=90=AF=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/ErrorLogger/ErrorLogger.cs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/BootstrapBlazor/Components/ErrorLogger/ErrorLogger.cs b/src/BootstrapBlazor/Components/ErrorLogger/ErrorLogger.cs index d299ef66cb2..9edd8c0e4d4 100644 --- a/src/BootstrapBlazor/Components/ErrorLogger/ErrorLogger.cs +++ b/src/BootstrapBlazor/Components/ErrorLogger/ErrorLogger.cs @@ -69,10 +69,6 @@ public class ErrorLogger : ComponentBase, IErrorLogger [NotNull] private BootstrapBlazorErrorBoundary? _errorBoundary = default; - private bool _enableErrorLogger => EnableErrorLogger ?? Options.CurrentValue.EnableErrorLogger; - - private bool _showToast => ShowToast ?? Options.CurrentValue.ShowErrorLoggerToast; - /// /// /// @@ -81,6 +77,8 @@ protected override void OnInitialized() base.OnInitialized(); ToastTitle ??= Localizer[nameof(ToastTitle)]; + EnableErrorLogger ??= Options.CurrentValue.EnableErrorLogger; + ShowToast ??= Options.CurrentValue.ShowErrorLoggerToast; } /// @@ -110,13 +108,13 @@ protected override void BuildRenderTree(RenderTreeBuilder builder) builder.CloseComponent(); } - private RenderFragment? RenderContent => _enableErrorLogger ? RenderError : ChildContent; + private RenderFragment? RenderContent => (EnableErrorLogger ?? false) ? RenderError : ChildContent; private RenderFragment RenderError => builder => { builder.OpenComponent(0); builder.AddAttribute(1, nameof(BootstrapBlazorErrorBoundary.OnErrorHandleAsync), OnErrorHandleAsync); - builder.AddAttribute(2, nameof(BootstrapBlazorErrorBoundary.ShowToast), _showToast); + builder.AddAttribute(2, nameof(BootstrapBlazorErrorBoundary.ShowToast), ShowToast); builder.AddAttribute(3, nameof(BootstrapBlazorErrorBoundary.ToastTitle), ToastTitle); builder.AddAttribute(4, nameof(BootstrapBlazorErrorBoundary.ErrorContent), ErrorContent); builder.AddAttribute(5, nameof(BootstrapBlazorErrorBoundary.ChildContent), ChildContent); From 97d3e3f926bea114b23621bcb778bc2029569b82 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 3 Jun 2025 14:28:03 +0800 Subject: [PATCH 13/14] =?UTF-8?q?refactor:=20=E7=A7=BB=E9=99=A4=20IHandler?= =?UTF-8?q?Exception=20=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Tab/Tab.razor.cs | 23 +------------------ 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs index 49fd1d762e8..03d691bb688 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs @@ -13,7 +13,7 @@ namespace BootstrapBlazor.Components; /// /// Tab component /// -public partial class Tab : IHandlerException +public partial class Tab { private bool FirstRender { get; set; } = true; @@ -454,9 +454,6 @@ public partial class Tab : IHandlerException [NotNull] private IIconTheme? IconTheme { get; set; } - [Inject, NotNull] - private DialogService? DialogService { get; set; } - [Inject] [NotNull] private FullScreenService? FullScreenService { get; set; } @@ -477,16 +474,6 @@ public partial class Tab : IHandlerException private bool IsPreventDefault => _contextMenuZone != null; - /// - /// - /// - protected override void OnInitialized() - { - base.OnInitialized(); - - ErrorLogger?.Register(this); - } - /// /// /// @@ -1014,13 +1001,6 @@ private RenderFragment RenderTabItemContent(TabItem item) => builder => } }; - /// - /// HandlerException 错误处理方法 - /// - /// - /// - public Task HandlerException(Exception ex, RenderFragment errorContent) => DialogService.ShowErrorHandlerDialog(errorContent(ex)); - private IEnumerable? _menuItems; private MenuItem? GetMenuItem(string url) { @@ -1228,7 +1208,6 @@ protected override async ValueTask DisposeAsync(bool disposing) if (disposing) { RemoveLocationChanged(); - ErrorLogger?.UnRegister(this); } } } From 9c08e4d3ae5e8b7c60c7790cab26c79d92750e78 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 3 Jun 2025 14:42:42 +0800 Subject: [PATCH 14/14] =?UTF-8?q?test:=20=E5=A2=9E=E5=8A=A0=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 --- .../Extensions/DialogServiceExtensions.cs | 19 +++++++++++++++++++ test/UnitTest/Components/DialogTest.cs | 5 +++++ 2 files changed, 24 insertions(+) diff --git a/src/BootstrapBlazor/Extensions/DialogServiceExtensions.cs b/src/BootstrapBlazor/Extensions/DialogServiceExtensions.cs index 999edeef743..3a3d6f77480 100644 --- a/src/BootstrapBlazor/Extensions/DialogServiceExtensions.cs +++ b/src/BootstrapBlazor/Extensions/DialogServiceExtensions.cs @@ -263,4 +263,23 @@ public static async Task ShowErrorHandlerDialog(this DialogService service, Rend }; await service.Show(option, dialog); } + + /// + /// 显示异常信息对话框扩展方法 + /// + /// + /// + /// + /// + public static async Task ShowExceptionDialog(this DialogService service, Exception exception, Dialog? dialog = null) + { + RenderFragment fragment = builder => + { + builder.OpenElement(0, "div"); + builder.AddAttribute(10, "class", "error-stack"); + builder.AddContent(20, new MarkupString(exception.Message)); + builder.CloseElement(); + }; + await ShowErrorHandlerDialog(service, fragment, dialog); + } } diff --git a/test/UnitTest/Components/DialogTest.cs b/test/UnitTest/Components/DialogTest.cs index 29c4c60c4ff..ffe63470018 100644 --- a/test/UnitTest/Components/DialogTest.cs +++ b/test/UnitTest/Components/DialogTest.cs @@ -578,6 +578,11 @@ await cut.InvokeAsync(() => dialog.ShowCloseDialog("Clos await cut.InvokeAsync(() => dialog.Show("Test Title")); await cut.InvokeAsync(() => modal.Instance.CloseCallback()); #endregion + + #region ShowExceptionDialog Method + await cut.InvokeAsync(() => dialog.ShowExceptionDialog(new Exception("Test"))); + await cut.InvokeAsync(() => modal.Instance.CloseCallback()); + #endregion } private class MockValidateFormDialog : ComponentBase