From a7610e51cb7b994872257ec5fe63e9a10f2a39af Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 29 Apr 2026 16:19:29 +0800 Subject: [PATCH 1/2] fix: blazor ``/`` lose `PathBase` for `WebAssemblyStyleFiles`/`WebAssemblyScriptFiles` Resolve `WebAssemblyStyleFiles` and `WebAssemblyScriptFiles` through `IComponentBundleUrlBuilder` so they receive the same `PathBase` prefixing as the prerender bundle files. --- .../Bundling/AbpScripts.razor | 2 +- .../Bundling/AbpStyles.razor | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Bundling/AbpScripts.razor b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Bundling/AbpScripts.razor index a607815421..6560d97bd6 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Bundling/AbpScripts.razor +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Bundling/AbpScripts.razor @@ -45,7 +45,7 @@ { if (OperatingSystem.IsBrowser() && WebAssemblyScriptFiles != null) { - ScriptFiles = WebAssemblyScriptFiles; + ScriptFiles = await ResolveAsync(WebAssemblyScriptFiles); } } } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Bundling/AbpStyles.razor b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Bundling/AbpStyles.razor index 2ebdf1aecf..015ef9fa35 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Bundling/AbpStyles.razor +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Bundling/AbpStyles.razor @@ -46,7 +46,7 @@ StyleFiles = scriptFiles; if (OperatingSystem.IsBrowser() && StyleFiles != null && WebAssemblyStyleFiles != null) { - StyleFiles.AddIfNotContains(WebAssemblyStyleFiles); + StyleFiles.AddIfNotContains(await ResolveAsync(WebAssemblyStyleFiles)); } } } @@ -59,7 +59,7 @@ { _hasRemoveServerStyle = true; await Task.Delay(3000); - StyleFiles = WebAssemblyStyleFiles; + StyleFiles = await ResolveAsync(WebAssemblyStyleFiles); StateHasChanged(); } } From a39ec69d127420a641f41f3810e3b9207356df84 Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 29 Apr 2026 16:57:03 +0800 Subject: [PATCH 2/2] Address Copilot review feedback --- .../Bundling/ComponentBundleUrlBuilder.cs | 5 +++++ .../Bundling/ComponentBundleUrlBuilder_Tests.cs | 14 ++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Bundling/ComponentBundleUrlBuilder.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Bundling/ComponentBundleUrlBuilder.cs index 7d27f1711c..98c003e485 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Bundling/ComponentBundleUrlBuilder.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web.Theming/Bundling/ComponentBundleUrlBuilder.cs @@ -34,6 +34,11 @@ public class ComponentBundleUrlBuilder : IComponentBundleUrlBuilder, ITransientD return Task.FromResult(fileName); } + if (fileName.StartsWith(normalized, StringComparison.Ordinal)) + { + return Task.FromResult(fileName); + } + return Task.FromResult(normalized + fileName.RemovePreFix("/")); } diff --git a/framework/test/Volo.Abp.AspNetCore.Components.Web.Theming.Tests/Volo/Abp/AspNetCore/Components/Web/Theming/Bundling/ComponentBundleUrlBuilder_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Components.Web.Theming.Tests/Volo/Abp/AspNetCore/Components/Web/Theming/Bundling/ComponentBundleUrlBuilder_Tests.cs index a47250aaa4..a13abafe97 100644 --- a/framework/test/Volo.Abp.AspNetCore.Components.Web.Theming.Tests/Volo/Abp/AspNetCore/Components/Web/Theming/Bundling/ComponentBundleUrlBuilder_Tests.cs +++ b/framework/test/Volo.Abp.AspNetCore.Components.Web.Theming.Tests/Volo/Abp/AspNetCore/Components/Web/Theming/Bundling/ComponentBundleUrlBuilder_Tests.cs @@ -102,4 +102,18 @@ public class ComponentBundleUrlBuilder_Tests (await _builder.BuildAsync("/__bundles/Global.css", appBasePath: " ", navigationBaseUri: "https://localhost/foo/")) .ShouldBe("/foo/__bundles/Global.css"); } + + [Fact] + public async Task Should_Be_Idempotent_For_Already_Prefixed_FileName() + { + (await _builder.BuildAsync("/foo/__bundles/Global.css", appBasePath: "/foo", navigationBaseUri: null)) + .ShouldBe("/foo/__bundles/Global.css"); + } + + [Fact] + public async Task Should_Be_Idempotent_When_PathBase_Resolved_From_NavigationBaseUri() + { + (await _builder.BuildAsync("/foo/__bundles/Global.css", appBasePath: null, navigationBaseUri: "https://localhost/foo/")) + .ShouldBe("/foo/__bundles/Global.css"); + } }