From 208e4950f4706e3338719bd9f103ae728c365967 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Thu, 2 Apr 2026 21:23:23 +0800 Subject: [PATCH 01/13] feat(MaskOption): add AppendToBody parameter --- src/BootstrapBlazor/Components/Mask/MaskOption.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/BootstrapBlazor/Components/Mask/MaskOption.cs b/src/BootstrapBlazor/Components/Mask/MaskOption.cs index 13f416e32e6..b0ac1ac590b 100644 --- a/src/BootstrapBlazor/Components/Mask/MaskOption.cs +++ b/src/BootstrapBlazor/Components/Mask/MaskOption.cs @@ -46,4 +46,11 @@ public class MaskOption /// Gets or sets Mask Parent Container Selector. Default null /// public string? Selector { get; set; } + + /// + /// 获得/设置 是否将遮罩追加到 body 元素 默认 true + /// Gets or sets whether to append the mask to the body element. Default true + /// v10.5.1 + /// + public bool AppendToBody { get; set; } = true; } From a93b7b4c8b923b0ad093fa058f2938bc0f8561fb Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Thu, 2 Apr 2026 21:23:46 +0800 Subject: [PATCH 02/13] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E8=84=9A?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/Mask/Mask.razor.cs | 3 ++- src/BootstrapBlazor/Components/Mask/Mask.razor.js | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/BootstrapBlazor/Components/Mask/Mask.razor.cs b/src/BootstrapBlazor/Components/Mask/Mask.razor.cs index 52febe229df..70c30ac5ba2 100644 --- a/src/BootstrapBlazor/Components/Mask/Mask.razor.cs +++ b/src/BootstrapBlazor/Components/Mask/Mask.razor.cs @@ -47,7 +47,8 @@ protected override async Task OnAfterRenderAsync(bool firstRender) { Show = _options != null, _options?.ContainerId, - _options?.Selector + _options?.Selector, + _options?.AppendToBody }); } } diff --git a/src/BootstrapBlazor/Components/Mask/Mask.razor.js b/src/BootstrapBlazor/Components/Mask/Mask.razor.js index dce4973193e..28048160e34 100644 --- a/src/BootstrapBlazor/Components/Mask/Mask.razor.js +++ b/src/BootstrapBlazor/Components/Mask/Mask.razor.js @@ -1,7 +1,7 @@ -export function update(id, options) { +export function update(id, options) { const mask = document.getElementById(id); if (mask) { - const { show } = options; + const { show, appendToBody } = options; const el = document.querySelector(`[data-bb-mask="${id}"]`); const container = getContainerBySelector(options); if (container) { @@ -14,7 +14,7 @@ container.appendChild(el); } } - else { + else if (appendToBody === true) { document.body.appendChild(el); } From 6429c13b2d0d708425f1172e63c251b1e763308d Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Thu, 2 Apr 2026 21:24:05 +0800 Subject: [PATCH 03/13] chore: bump version 10.5.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 6ce5e82c256..6e0504c7a8b 100644 --- a/src/BootstrapBlazor/BootstrapBlazor.csproj +++ b/src/BootstrapBlazor/BootstrapBlazor.csproj @@ -1,7 +1,7 @@  - 10.5.0 + 10.5.1-beta03 From 3ea322a66bec15088645b8576a9bf8d9b72b9fd7 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 3 Apr 2026 10:55:17 +0800 Subject: [PATCH 04/13] =?UTF-8?q?doc:=20=E6=9B=B4=E6=96=B0=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/Mask/Mask.razor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BootstrapBlazor/Components/Mask/Mask.razor b/src/BootstrapBlazor/Components/Mask/Mask.razor index a273b6dda1e..5e67cedd1d8 100644 --- a/src/BootstrapBlazor/Components/Mask/Mask.razor +++ b/src/BootstrapBlazor/Components/Mask/Mask.razor @@ -1,4 +1,4 @@ -@namespace BootstrapBlazor.Components +@namespace BootstrapBlazor.Components @inherits BootstrapModuleComponentBase @attribute [BootstrapModuleAutoLoader(AutoInvokeInit = false, AutoInvokeDispose = false)] From 8876a1259360e65bdf8a99dd535dff7aa82cc081 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 3 Apr 2026 10:55:29 +0800 Subject: [PATCH 05/13] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E9=94=80?= =?UTF-8?q?=E6=AF=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/Mask/Mask.razor.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/BootstrapBlazor/Components/Mask/Mask.razor.cs b/src/BootstrapBlazor/Components/Mask/Mask.razor.cs index 70c30ac5ba2..40b68e5f152 100644 --- a/src/BootstrapBlazor/Components/Mask/Mask.razor.cs +++ b/src/BootstrapBlazor/Components/Mask/Mask.razor.cs @@ -64,4 +64,19 @@ private Task CloseAsync() { return Show(null); } + + /// + /// + /// + /// + /// + protected override async ValueTask DisposeAsync(bool disposing) + { + await base.DisposeAsync(disposing); + + if (disposing) + { + MaskService.UnRegister(this); + } + } } From bba9f41492310952278af15ee7facfd3a7f68513 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 3 Apr 2026 13:18:07 +0800 Subject: [PATCH 06/13] chore: bump version 10.5.1-beta04 --- 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 6e0504c7a8b..4e34b2620d4 100644 --- a/src/BootstrapBlazor/BootstrapBlazor.csproj +++ b/src/BootstrapBlazor/BootstrapBlazor.csproj @@ -1,7 +1,7 @@  - 10.5.1-beta03 + 10.5.1-beta04 From fef04dd46bae3acda870b4d7059fc1f091c672aa Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 3 Apr 2026 19:22:21 +0800 Subject: [PATCH 07/13] =?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.Server/Components/Samples/Masks.razor.cs | 2 +- src/BootstrapBlazor/Components/Mask/Mask.razor.cs | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/BootstrapBlazor.Server/Components/Samples/Masks.razor.cs b/src/BootstrapBlazor.Server/Components/Samples/Masks.razor.cs index 819f1a90d97..5d3a1671c07 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/Masks.razor.cs +++ b/src/BootstrapBlazor.Server/Components/Samples/Masks.razor.cs @@ -1,4 +1,4 @@ -// Licensed to the .NET Foundation under one or more agreements. +// 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 diff --git a/src/BootstrapBlazor/Components/Mask/Mask.razor.cs b/src/BootstrapBlazor/Components/Mask/Mask.razor.cs index 40b68e5f152..d8725374237 100644 --- a/src/BootstrapBlazor/Components/Mask/Mask.razor.cs +++ b/src/BootstrapBlazor/Components/Mask/Mask.razor.cs @@ -60,10 +60,7 @@ private Task Show(MaskOption? option) return Task.CompletedTask; } - private Task CloseAsync() - { - return Show(null); - } + private Task CloseAsync() => Show(null); /// /// From 3581d9a97f11c3997c909cf75d4ca09e7e9da560 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 3 Apr 2026 20:54:39 +0800 Subject: [PATCH 08/13] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=85=B3?= =?UTF-8?q?=E9=97=AD=E6=97=B6=E5=85=A8=E5=B1=8F=E9=81=AE=E7=BD=A9=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Mask/Mask.razor.cs | 16 ++++++++++-- .../Components/Mask/Mask.razor.js | 25 +++++++++---------- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/BootstrapBlazor/Components/Mask/Mask.razor.cs b/src/BootstrapBlazor/Components/Mask/Mask.razor.cs index d8725374237..431a61d0e5d 100644 --- a/src/BootstrapBlazor/Components/Mask/Mask.razor.cs +++ b/src/BootstrapBlazor/Components/Mask/Mask.razor.cs @@ -19,9 +19,11 @@ public partial class Mask .AddClass($"--bb-mask-zindex: {_options.ZIndex};", _options.ZIndex != null) .AddClass($"--bb-mask-bg: {_options.BackgroundColor};", _options.BackgroundColor != null) .AddClass($"--bb-mask-opacity: {_options.Opacity};", _options.Opacity != null) + .AddClass($"--bb-mask-position: absolute;", !string.IsNullOrEmpty(_options.ContainerId) || !string.IsNullOrEmpty(_options.Selector)) .Build(); private MaskOption? _options; + private bool _show = false; /// /// @@ -45,7 +47,7 @@ protected override async Task OnAfterRenderAsync(bool firstRender) { await InvokeVoidAsync("update", Id, new { - Show = _options != null, + Show = _show, _options?.ContainerId, _options?.Selector, _options?.AppendToBody @@ -55,7 +57,17 @@ protected override async Task OnAfterRenderAsync(bool firstRender) private Task Show(MaskOption? option) { - _options = option; + if (option != null) + { + // 服务打开遮罩调用 + _options = option; + _show = true; + } + else + { + // 服务关闭遮罩调用 + _show = false; + } StateHasChanged(); return Task.CompletedTask; } diff --git a/src/BootstrapBlazor/Components/Mask/Mask.razor.js b/src/BootstrapBlazor/Components/Mask/Mask.razor.js index 28048160e34..8766dd1e174 100644 --- a/src/BootstrapBlazor/Components/Mask/Mask.razor.js +++ b/src/BootstrapBlazor/Components/Mask/Mask.razor.js @@ -9,23 +9,22 @@ export function update(id, options) { if (position === '' || position === 'static') { container.style.setProperty('position', 'relative'); } - if (show) { - el.style.setProperty('--bb-mask-position', 'absolute'); - container.appendChild(el); - } + reset(el, mask, container, show); } else if (appendToBody === true) { - document.body.appendChild(el); + reset(el, mask, document.body, show); } + } +} - if (show) { - el.classList.add('show'); - } - else { - el.classList.remove('show'); - el.style.removeProperty('--bb-mask-position'); - mask.appendChild(el); - } +const reset = (el, mask, container, status) => { + if (status) { + container.appendChild(el); + el.classList.add('show'); + } + else { + el.classList.remove('show'); + mask.appendChild(el); } } From 33c0eba4d5424a9b604d1e5b9ddca6b660c32658 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 3 Apr 2026 21:29:47 +0800 Subject: [PATCH 09/13] =?UTF-8?q?refactor:=20=E4=BD=BF=E7=94=A8=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/Mask/Mask.razor.cs | 1 - src/BootstrapBlazor/Components/Mask/Mask.razor.scss | 5 ++--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/BootstrapBlazor/Components/Mask/Mask.razor.cs b/src/BootstrapBlazor/Components/Mask/Mask.razor.cs index 431a61d0e5d..57db3fb326f 100644 --- a/src/BootstrapBlazor/Components/Mask/Mask.razor.cs +++ b/src/BootstrapBlazor/Components/Mask/Mask.razor.cs @@ -19,7 +19,6 @@ public partial class Mask .AddClass($"--bb-mask-zindex: {_options.ZIndex};", _options.ZIndex != null) .AddClass($"--bb-mask-bg: {_options.BackgroundColor};", _options.BackgroundColor != null) .AddClass($"--bb-mask-opacity: {_options.Opacity};", _options.Opacity != null) - .AddClass($"--bb-mask-position: absolute;", !string.IsNullOrEmpty(_options.ContainerId) || !string.IsNullOrEmpty(_options.Selector)) .Build(); private MaskOption? _options; diff --git a/src/BootstrapBlazor/Components/Mask/Mask.razor.scss b/src/BootstrapBlazor/Components/Mask/Mask.razor.scss index 203e1e40d56..4f90f913ac5 100644 --- a/src/BootstrapBlazor/Components/Mask/Mask.razor.scss +++ b/src/BootstrapBlazor/Components/Mask/Mask.razor.scss @@ -1,11 +1,10 @@ -@use "../../wwwroot/scss/variables" as *; +@use "../../wwwroot/scss/variables" as *; .bb-mask { --bb-mask-zindex: #{$bb-mask-zindex}; --bb-mask-bg: #{$bb-mask-bg}; --bb-mask-opacity: #{$bb-mask-opacity}; - --bb-mask-position: fixed; - position: var(--bb-mask-position); + position: absolute; top: 0; right: 0; bottom: 0; From ee1814dbef04063b1608468df79579d2712c663b Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 3 Apr 2026 21:45:33 +0800 Subject: [PATCH 10/13] =?UTF-8?q?refactor:=20=E6=8F=90=E9=AB=98=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=8F=AF=E8=AF=BB=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/Mask/Mask.razor.cs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/BootstrapBlazor/Components/Mask/Mask.razor.cs b/src/BootstrapBlazor/Components/Mask/Mask.razor.cs index 57db3fb326f..fdd5d6a7d9a 100644 --- a/src/BootstrapBlazor/Components/Mask/Mask.razor.cs +++ b/src/BootstrapBlazor/Components/Mask/Mask.razor.cs @@ -56,16 +56,17 @@ protected override async Task OnAfterRenderAsync(bool firstRender) private Task Show(MaskOption? option) { - if (option != null) + if (option == null) { - // 服务打开遮罩调用 - _options = option; - _show = true; + // 服务关闭遮罩调用 + _options?.ChildContent = null; + _show = false; } else { - // 服务关闭遮罩调用 - _show = false; + // 服务打开遮罩调用 + _options = option; + _show = true; } StateHasChanged(); return Task.CompletedTask; From 3218f64e6c5a08c19e02494358a356d12afb11bf Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 3 Apr 2026 21:45:49 +0800 Subject: [PATCH 11/13] =?UTF-8?q?refactor:=20=E6=89=A9=E5=B1=95=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E5=A2=9E=E5=8A=A0=20AppendToBody=20=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/MaskServiceExtensions.cs | 82 ++++++++++--------- test/UnitTest/Services/MaskServiceTest.cs | 3 +- 2 files changed, 45 insertions(+), 40 deletions(-) diff --git a/src/BootstrapBlazor/Extensions/MaskServiceExtensions.cs b/src/BootstrapBlazor/Extensions/MaskServiceExtensions.cs index 89ee4d8be0f..8176b013f6e 100644 --- a/src/BootstrapBlazor/Extensions/MaskServiceExtensions.cs +++ b/src/BootstrapBlazor/Extensions/MaskServiceExtensions.cs @@ -11,46 +11,50 @@ namespace BootstrapBlazor.Components; /// public static class MaskServiceExtensions { - - /// - /// Show 扩展方法 - /// Show extension method - /// - /// - /// - /// - /// - /// - /// - /// - public static Task Show(this MaskService maskService, IDictionary? parameters = null, string? containerId = null, string? backgroundColor = null, float opacity = 0.5f, int zIndex = 1050, Mask? mask = null) where TComponent : ComponentBase => maskService.Show(new MaskOption() + extension(MaskService maskService) { - BackgroundColor = backgroundColor, - Opacity = opacity, - ZIndex = zIndex, - ContainerId = containerId, - ChildContent = BootstrapDynamicComponent.CreateComponent(parameters).Render() - }, mask); + /// + /// Show 扩展方法 + /// Show extension method + /// + /// + /// + /// + /// + /// + /// + /// + public Task Show(IDictionary? parameters = null, string? containerId = null, string? backgroundColor = null, float opacity = 0.5f, int zIndex = 1050, bool appendToBody = true, Mask? mask = null) where TComponent : ComponentBase => maskService.Show(new MaskOption() + { + BackgroundColor = backgroundColor, + Opacity = opacity, + ZIndex = zIndex, + ContainerId = containerId, + ChildContent = BootstrapDynamicComponent.CreateComponent(parameters).Render(), + AppendToBody = appendToBody + }, mask); - /// - /// Show 扩展方法 - /// Show extension method - /// - /// - /// - /// - /// - /// - /// - /// - /// - public static Task Show(this MaskService maskService, Type type, IDictionary? parameters = null, string? containerId = null, string? backgroundColor = null, float opacity = 0.5f, int zIndex = 1050, Mask? mask = null) => maskService.Show(new MaskOption() - { - BackgroundColor = backgroundColor, - Opacity = opacity, - ZIndex = zIndex, - ContainerId = containerId, - ChildContent = BootstrapDynamicComponent.CreateComponent(type, parameters).Render() - }, mask); + /// + /// Show 扩展方法 + /// Show extension method + /// + /// + /// + /// + /// + /// + /// + /// + /// + public Task Show(Type type, IDictionary? parameters = null, string? containerId = null, string? backgroundColor = null, float opacity = 0.5f, int zIndex = 1050, bool appendToBody = true, Mask? mask = null) => maskService.Show(new MaskOption() + { + BackgroundColor = backgroundColor, + Opacity = opacity, + ZIndex = zIndex, + ContainerId = containerId, + ChildContent = BootstrapDynamicComponent.CreateComponent(type, parameters).Render(), + AppendToBody = appendToBody + }, mask); + } } diff --git a/test/UnitTest/Services/MaskServiceTest.cs b/test/UnitTest/Services/MaskServiceTest.cs index 054ab6fb89a..cc3b3360ad8 100644 --- a/test/UnitTest/Services/MaskServiceTest.cs +++ b/test/UnitTest/Services/MaskServiceTest.cs @@ -25,7 +25,8 @@ await maskService.Show(new MaskOption() BackgroundColor = "#000", Opacity = 0.5f, ZIndex = 1050, - ChildContent = builder => builder.AddContent(0, "test-mask-content") + ChildContent = builder => builder.AddContent(0, "test-mask-content"), + AppendToBody = true }); }); }); From cfac63890d0c807d7b073635d66116305f370401 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 3 Apr 2026 21:49:47 +0800 Subject: [PATCH 12/13] =?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/Services/MaskServiceTest.cs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/test/UnitTest/Services/MaskServiceTest.cs b/test/UnitTest/Services/MaskServiceTest.cs index cc3b3360ad8..f254eef5704 100644 --- a/test/UnitTest/Services/MaskServiceTest.cs +++ b/test/UnitTest/Services/MaskServiceTest.cs @@ -117,6 +117,26 @@ public async Task Show_Type() await cut.InvokeAsync(() => button.Click()); } + [Fact] + public async Task Show_Ok() + { + var maskService = Context.Services.GetRequiredService(); + var cut = Context.Render(pb => + { + pb.AddChildContent