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); diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor b/src/BootstrapBlazor/Components/Tab/Tab.razor index b7b4796c7c7..7770f616e42 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) => @
- 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); } } } 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(); 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 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] 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 => {